如何使用socket.io和laravel发送用户特定数据?

时间:2016-02-11 13:49:42

标签: angularjs node.js laravel socket.io jwt

我不确定如何正确地说出这个问题,但我在这里。我有laravel,angular,node w / socket.io,我也使用JWT进行身份验证。我的最终目标是能够向特定用户发送实时更新通知。对于我的生活,我似乎无法了解工作流程。

我的初始是在握手中发送jwt然后在节点中使用然后执行http请求以获取数据,然后返回所述数据。换句话说,当触发特定事件时,节点将已经拥有该令牌,向laravel发送请求以获取特定信息。

有人可以向我解释如何通过socket.io在此架构中发送用户特定数据吗?

1 个答案:

答案 0 :(得分:0)

我发现这篇很棒的文章: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 user是用户ID。

socket.on('userNotifications.'+ user+':App\\Events\\notifications', function(message){
                        console.log(message);
                    });