我發現這篇大文章:https://www.ukietech.com/blog/programming/step-by-step-instruction-of-setting-up-real-time-secure-broadcasting-with-laravel-5-1-socket-io-and-redis/
這讓我在正確的軌道上。
首先,我需要在我JWT傳遞到插座:
var socket = io('http://192.168.10.10:3000', {query: "Authorization="+$rootScope.$storage.satellizer_token});
接下來,我居然驗證令牌..一次。我知道這可能是矯枉過正,但我想知道什麼命中插座是合法的。
io.use(function(socket, next){
if (socket.handshake.query.Authorization) {
var config = {
url:'http://192.168.10.10/api/auth',
headers:{
Authorization:'Bearer '+socket.handshake.query.Authorization
}
};
request.get(config,function(error,response,body){
socket.userId = JSON.parse(body).id;
next();
});
}
// call next() with an Error if you need to reject the connection.
next(new Error('Authentication error'));
});
該代碼塊中的請求基於經過身份驗證的令牌返回一個用戶對象。有關更多信息,請參閱JWTAuth。
然後在連接上,我將爲用戶分配一個唯一的通道。
io.on('connection',function(socket){
socket.join('userNotifications.'+socket.userId);
console.log('user joined room: userNotifications.'+socket.userId);
});
然後廣播事件:
notifications.on('pmessage', function(subscribed, channel, message) {
var m = JSON.parse(message);
io.emit(channel+":"+m.event, message);
});
回到客戶端上的我聽的通道。 var用戶是用戶標識。
socket.on('userNotifications.'+ user+':App\\Events\\notifications', function(message){
console.log(message);
});