【问题标题】:user authentication using socket.io使用 socket.io 进行用户身份验证
【发布时间】:2013-11-02 02:27:34
【问题描述】:

我已将此教程设为红色:http://howtonode.org/socket-io-auth。 它展示了如何使用 express 和 socket.io 对用户进行身份验证。 但是有没有办法只使用 socket.io 而不需要 express 来验证用户?

编辑:

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

【问题讨论】:

  • 您是否将 Socket.IO 用作独立设备?身份验证器不创建 cookie,它只是将它们传递给 Socket.IO。
  • @hexacyanide 目前我正在将 express 与 socket.io 一起使用。 Express 仅创建身份验证 cookie。我不使用它的路由,中间件,.... express 和 socket.io 之间的会话与 connect-redis 共享。我认为仅使用 express 来签署 cookie 的依赖性太大。所以我正在寻找一种不依赖于快递(连接)的解决方案。我可以实现自己的未经测试且不安全的身份验证程序,但就像 Golo Roden 建议的那样,这是不可取的。
  • 也就是说,您想要一个在基本 HTTP 服务器上运行的实现?因为如果你不想完全使用 HTTP 服务器,那么你会想要使用 cookie 吗?
  • @hexacyanide 是的。只需要一个可以处理签名身份验证 cookie 的节点模块。我知道如何使用 node 实现一个简单的 HTTP 服务器。但不知道有任何经过测试的节点模块可以创建签名的 cookie。我只想在第一个 req/res 周期中使用 HTTP 服务器。我正在使用 cookie,因为您可以保护它们免受 XSS 攻击并使其仅使用 HTTPS。

标签: node.js authentication socket.io


【解决方案1】:

我知道这有点老了,但对于未来的读者来说,除了解析 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
});

我写了关于这个方法和cookieshere的更详细的解释。

【讨论】:

  • 因此,令牌不像会话那样使用?如,令牌不存储在除客户端之外的任何地方?使用秘密解码令牌是否与在会话存储中使用令牌作为会话 ID 相同(在安全性方面)?我只是想了解这种基于令牌的方法的好处。
  • @José F. Romaniello 虽然我要求基于 cookie 的身份验证,但我会接受您的回答。那时在 2013 年,我认为饼干是最好的选择。在阅读了您的文章(以及其他一些关于 auth0 的文章)后,我将尝试使用令牌。
【解决方案2】:

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

我猜(但不知道)因为您需要某种会话处理,所以有人投反对票,而且您很可能也不想手动执行此操作 ;-)。因此,在这里坚持使用 Express 是一个非常好的主意。

尽管如此,这是一个有趣的问题,虽然我无法回答没有 Express 的情况。

【讨论】:

【解决方案3】:

我对 node.js 很陌生,几天前才开始。我只能回答问题的第一部分,即不使用 express 的用户身份验证。而且我还没有会话式处理。
我仍在回答这个问题的原因是为了帮助其他刚接触 node 的人一开始就使用更简单的替代解决方案。

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

http 服务器上的用户认证是通过读取一些 POST 数据来处理的。只有当 POST 数据是有效的用户数据时,用户才被允许继续到 socket.io 接口所在的聊天室。

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 2014-12-01
    • 1970-01-01
    • 2019-08-17
    • 1970-01-01
    • 1970-01-01
    • 2010-10-02
    • 2014-02-07
    • 2014-06-11
    相关资源
    最近更新 更多