Oto moja server.js
file:Jak chronić kanały prywatne podczas korzystania z socket.io i Laravel Echo?
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var Redis = require('ioredis');
var redis = new Redis();
http.listen(3000, function(){
console.log('Listening on Port 3000');
});
redis.psubscribe('*', function(err, count) {
console.log(err, count);
});
redis.on('pmessage', function(subscribed, channel, message) {
message = JSON.parse(message);
io.emit(message.event, channel, message.data);
});
i prosty event:
class FieldWasUpdated implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $instance;
public $key;
public $value;
public function __construct($instance, $key, $value)
{
$this->instance = $instance;
$this->key = $key;
$this->value = $value;
}
public function broadcastOn()
{
return new PrivateChannel("model." . $this->instance->getModelType() . "." . $this->instance->id);
}
}
Klient łączy się socket.io:
Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':3000'
});
A następnie nasłuchuje zdarzeń (to jest wewnątrz szablonu Blade):
var channel = "model.{{ $instance->getModelType() }}.{{ $instance->id }}";
Echo.private(channel)
.listen("FieldWasUpdated", function(e) {
window.VueBus.$emit("updated", channel, e.key, e.value);
})
.listen("FieldBecameDisabled", function(e) {
window.VueBus.$emit("disabled", channel, e.key);
});
Problem: uwierzytelnianie nie jest obsługiwane, każdy użytkownik może zasubskrybować te kanały.
Broadcast::channel("model.announcement.*", function($user, $id) {
return false; // this function is not called
})
Oto wydarzenie próbka z konsoli programisty Chrome (websocket):
[
"App\\Events\\FieldWasUpdated",
"private-model.announcement.2",
{
"instance":
{
"type":"ANN_TYPE_MISSED_CALL",
"status":"ANN_STATUS_CANCELLED",
"name":"1233421",
"phone":"+7(222)222-3322",
"email":"[email protected]",
"message":"sdgdsgsdgdfdg",
"requirement":null,
"web_type":"ANN_WEB_TYPE_UNKNOWN",
"url":null,
"responsible_id":19,
"recommender_id":18
},
"key":"message",
"value":"sdgdsgsdgdfdg"
}
]
Również nie ma /broadcast/auth
URL, ale BroadcastServiceProvider
ma wezwanie do Broadcast::routes();
i po załadowaniu przeglądarki, brak połączenia do /broadcast/auth
występuje.
try Broadcast :: channel ("model.announcement. *", Funkcja ($ user, $ id) { abort (401); }) –