将socket.io id绑定到没有session的用户id(express,passport JWT)

时间:2017-04-28 21:12:18

标签: express socket.io webrtc jwt passport.js

我正在快递上开发RESTful API,使用JWT和护照进行授权。我想实现socket.io连接以用于通知和信令目的(WebRTC会话建立)。我不想实现标准会话管理,不想处理cookie,但不知何故,我必须能够通过套接字解决特定用户。我在所有路线中都有事件处理,因此app知道已授权的请求和相应的用户ID。一种方法(可能)是使用用户ID创建socket io组,向该组添加套接字并在那里发出。 (在每个后续请求中使用重新连接处理和检查套接字存在 - 这样做过于复杂)。我想应该有更好的方法。我也使用Redis,所以我可以在这个方案中利用它。任何建议表示赞赏,谢谢

1 个答案:

答案 0 :(得分:0)

好吧,我设法以这种方式解决了这个问题。

服务器:

import jwt from 'jwt-simple'; //I'm using ES6/Babel

module.exports = function(app)  {
var io = app.get('io'); //Import io any possible way, 
                        //here I do it like so because I set     
                        //app.set('io', io) in my index.js
var user_id;

io.on('connection', socket => {

// Recieve encoded token from client, decode and find user id
// To do - check againt database
socket.on('auth', token => {
  if (token) {
    var decoded = jwt.decode(token, 'secret')
    user_id = decoded.sub
    socket.emit('auth', user_id);
  }
})

// Join room proposed by client - user id string
socket.on('room', room => {
  socket.join(room)
  console.log('Server joined room...', room)

  //emit message to user id from anywhere in the app
  io.sockets.in(user_id).emit('message', 'what is going on, party people?');
  })   

 })
}

客户端:

  var token = localStorage.getItem('token');
  var socket = io(); 

  socket.on('connect', data => {
  socket.emit('auth', token);
  socket.on('auth', user_id => {
    socket.emit('room', user_id);
  })
})

现在要解决特定用户的问题,如果用户有凭据,我总是可以发出等于用户ID的房间ID。即使在浏览器刷新之后。

Photo: the left client has valid token in localStorage, the right one doesn't