【问题标题】:Allow connection only for authorised socket in sails.js仅允许在sails.js 中授权套接字连接
【发布时间】:2017-01-04 11:19:57
【问题描述】:

我正在尝试在sails.js 后端(使用版本0.12.x)中为socket.io 客户端实现某种安全性。为了实现这一点,我尝试阻止没有正确 cookie 的客户端成功握手(事先没有授权会话),或者喜欢使用 passport.js 来查看客户端是否经过身份验证的 HTTP 请求。

在 Sails.js 文档中,我发现这应该是可能的,但我找不到任何提示,如何真正做到这一点。另一方面,在互联网上寻找示例,人们大多不使用套接字安全性,或者使用一些旧版本的sails.js(

到目前为止我发现的最接近的是config/sockets.js

beforeConnect: function(handshake, cb) {
  if (handshake.headers.cookie) {
      console.log(handshake);
      // TODO: check session authorization
  } else {
     return cb(null, false);
  }
  return cb(null, true);
},

这应该检查与握手一起发送的 cookie,如果它有一个正确的会话。我很难弄清楚,如何将 cookie 中的 sid 映射到sails.js 中的当前会话,以决定是否应允许连接。

问题:

  • 如果只允许少量客户端(应该允许大约 40-50 个动态生成的用户进行连接),而没有其他人,那么 socket.io 的最佳安全实践是什么?
  • 如何将 cookie 中的sails.sid 映射到活动会话?
  • 还有哪些其他配置可以成为我的目标的捷径(例如,设置一些策略,socket.io 请求使用与 http 相同的中间件)?

感谢任何提示、链接或建议。

【问题讨论】:

    标签: node.js sockets security socket.io sails.js


    【解决方案1】:

    socket.io 的最佳安全实践是什么,如果只是一个小 允许客户端数量(大约 40-50 个动态生成的用户 应该允许连接),而没有其他人?

    我不知道什么是最好的。但是有两种常见的方法:基于令牌和 cookie 的身份验证

    这是来自https://auth0.com/blog/auth-with-socket-io/的很好的可视化效果

    我真的很喜欢令牌方法,因为不需要会话存储。因此,服务器应用程序与客户端分离,并且也是无状态的。

    如何将 cookie 中的sails.sid 映射到活动会话?

    令牌方法:查看jsonwebtoken。当用户登录时,您会生成一个令牌并将其发送给客户端:

    res.json({
        user: user,
        token: jwToken.issue({id : user.id })
    });
    

    您还需要一个检查令牌是否存在并对其进行验证的策略:

    jwToken.verify(token, function (err, token) {
        if (err) return res.json(401, {err: 'Invalid Token!'});
        req.token = token; 
        next();
    });
    

    我找到了可能对您有所帮助的完整教程:https://thesabbir.com/how-to-use-json-web-token-authentication-with-sails-js/

    如何使用sails 进行配置:您基本上只需将令牌与每个socket.io 请求一起发送并检查策略中的令牌:

    SailsJS - using sails.io.js with JWT

    【讨论】:

    • 感谢您的出色回答,正是我所需要的。我根据您提供的链接使用令牌实现了它。目前,在使用令牌完成握手后,进一步的 socket.io 请求不再需要任何令牌。 (政策就像最后一个参考)提供合理的安全性可以吗?
    • @phev8 客户端只有在握手时才需要进行身份验证。之后,套接字连接保持打开状态,因此不再需要握手。当您刷新页面时,socket.io 应该需要再次握手。
    猜你喜欢
    • 2013-08-17
    • 2015-03-09
    • 2017-12-05
    • 2017-07-09
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    相关资源
    最近更新 更多