使用socket.io进行用户身份验证

时间:2013-10-23 17:07:30

标签: node.js authentication socket.io

我已经重温了这个教程:http://howtonode.org/socket-io-auth。 它显示了如何使用express和socket.io对用户进行身份验证。 但有没有办法只使用socket.io来验证用户,而不需要表达?

修改

对于会话处理,我使用RedisStore(https://github.com/LearnBoost/Socket.IO/wiki/Configuring-Socket.IO)。 剩下的是创建身份验证cookie的模块。 有没有人知道我可以使用socket.io实现创建一个身份验证cookie,就像你可以处理会话一样?

3 个答案:

答案 0 :(得分:9)

我知道这有点旧,但对于未来的读者,除了解析cookie和从存储中检索会话的方法(例如。passport.socketio)之外,您还可以考虑基于令牌的方法。

在这个例子中,我使用非常标准的JSON Web Tokens。您必须向客户端页面提供令牌,在此示例中,假设一个返回JWT的身份验证端点:

var jwt = require('jsonwebtoken');
// other requires

app.post('/login', function (req, res) {

  // TODO: validate the actual user user
  var profile = {
    first_name: 'John',
    last_name: 'Doe',
    email: 'john@doe.com',
    id: 123
  };

  // we are sending the profile in the token
  var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 });

  res.json({token: token});
});

现在,您的socket.io服务器可以配置如下:

var socketioJwt = require('socketio-jwt');

var sio = socketIo.listen(server);

sio.set('authorization', socketioJwt.authorize({
  secret: jwtSecret,
  handshake: true
}));

sio.sockets
  .on('connection', function (socket) {
     console.log(socket.handshake.decoded_token.email, 'has joined');
     //socket.on('event');
  });

socket.io-jwt中间件需要查询字符串中的标记,因此从客户端开始连接时只需附加它:

var socket = io.connect('', {
  query: 'token=' + token
});

我写了一个关于这种方法和cookies here的详细解释。

答案 1 :(得分:3)

相反或手动连接身份验证和会话处理代码,我建议使用专用模块,例如session.socket.io(但请注意,这是一个需要Express的模块)。

我猜(但不知道)因为你需要某种会话处理而存在downvotes,你很可能也不想手动执行此操作;-)。因此,坚持使用Express是个不错的主意。

然而,这是一个有趣的问题,虽然我不能回答如何在没有Express的情况下做到这一点。

答案 2 :(得分:1)

我是node.js的新手,几天前刚开始。我只能回答问题的第一部分,即不使用快递的用户身份验证。而且我还没有会话风格的处理 我仍在回答这个问题的原因是为了帮助其他刚接触节点的人,并在开始时使用更简单的替代解决方案。

我目前在我的学习项目中使用的解决方案(基于socket.io的聊天,还有什么?)正在使用http服务器进行身份验证。
如果您无法在http服务器上获得有效的身份验证,您将永远无法访问具有socket.io接口的页面。

通过读取一些POST数据来处理http服务器上的用户身份验证。只有当POST数据是有效的用户数据时,才允许用户进入socket.io接口所在的聊天。