2016-02-11 61 views
0

我不知道如何正確地說出這個問題,但我在這裏。我有laravel,angular,node w/socket.io,我也使用JWT進行身份驗證。我的最終目標是能夠向特定用戶發送實時更新通知。對於我的生活,我似乎無法瞭解工作流程如何。如何使用socket.io和laravel發送用戶特定的數據?

我最初的做法是在握手中發送jwt,然後在節點中使用http請求來獲取數據,然後返回所述數據。換句話說,當一個特定的事件被觸發時,節點將已經擁有令牌,向laravel發送請求以獲取特定信息。

有人可以請我解釋一下如何通過socket.io在這個架構中發送用戶特定的數據?

回答

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用戶是用戶標識。

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