如何将用户的登录令牌传递给socket.io?

时间:2015-09-05 14:02:49

标签: node.js express socket.io

如何将自定义登录的令牌传递给io连接?

所以基本上在我对用户进行身份验证之后,用户将获得令牌,但是如何将该令牌传递给socket.io连接并可能使用它。

这里是代码 - 这是在api.js

a = Convert.ToInt(b);
a = int.Parse(b);
a = Int32.Parse(b);

虽然这是在server.js

function ensureAuthenticated(req, res, next) {
  // I skip alot of codes for clarity
  var token = req.body.token || req.query.token || req.headers['x-access-token'];

   if (token) {
      req.user = user;
      return next();
   }
}
//Login 
router.post('/login', function(req, res) {
        // I skip the mongoose part for clarity
        var token = createToken(user);

        res.json({
          success: true,
          message: "Successfully login",
          token: token
        });
});

正如您所知,如果我必须设置用户名对象,我必须io.on('connection', function(socket) { socket.broadcast.emit('user joined', { username: socket.username, numUsers: numUsers }); socket.on('typing', function() { socket.broadcast.emit('typing', { username: socket.username }); }); socket.on('online', function() { socket.emit('online'); }); socket.on('chat', function(msg) { console.log("message: " + msg); io.emit('chat', msg); }); }); ,以使用用户名对象。

如果我做用户名:req.user,它将返回错误。我是否必须在username: socket.username中设置ensureAuthenticated功能才能使用它?

1 个答案:

答案 0 :(得分:1)

在任何传入套接字消息上,您可以通过以下方式访问套接字首次连接时存在的cookie:

socket.request.headers.cookie

因此,如果您的用户登录令牌位于cookie中,您可以从那里获取任何已连接的socket.io套接字。

您还可以使用socket.io中间件在连接时进行套接字身份验证,如下所示:Authentication with Node/Express/Socket.IO

socket.io doc here中的示例代码。

var io = require('socket.io')();
io.use(function(socket, next){
  if (socket.request.headers.cookie) return next();
  next(new Error('Authentication error'));
});