【问题标题】:Securing Socket.io保护 Socket.io
【发布时间】:2013-01-14 01:26:55
【问题描述】:

我正在使用基于 Node.js 的 https 服务器,该服务器使用 HTTP Basic 进行身份验证(这很好,因为数据是通过 SSL 加密连接发送的)。

现在我想提供一个 Socket.io 连接,应该是

  1. 加密和
  2. 仅适用于经过身份验证的用户。

问题是如何做到这一点。我已经发现在连接到套接字时我需要在客户端 JavaScript 代码中指定{ secure: true },但是如何在服务器端强制套接字连接只能通过 SSL 运行,并且它仅适用于经过身份验证的用户?

我猜 SSL 是最简单的部分,因为 Socket.io 服务器只绑定到 https 服务器,所以它应该只使用 SSL 运行,并且应该不可能通过(另外)运行它运行http服务器,对吧?

关于另一件事,我一点也不知道如何确保只有在用户使用 HTTP Basic 成功进行身份验证后才能建立套接字连接。

有什么想法吗?

【问题讨论】:

  • 您不能只使用 wss 协议而不是标准 ws 协议来加密有线通信吗?另外,验证用户是什么意思?您的意思是根据数据库中的凭据对发送的用户凭据进行身份验证吗?
  • 我没有找到有关如何在 socket.io 中保护套接字的相关文档(除了在服务器本身上实现 SSL)。 1) 我可以问一个例子,当我想让通道对客户安全时,在哪里放置标志{secure: true}? 2)另外,这个标志是否意味着从客户端到服务器的消息将被加密?或者这个标志本质上是做什么的? 3)最后,如果套接字/通道不安全,有没有办法阻止节点应用程序或与客户端的连接?非常感谢。

标签: node.js authentication ssl websocket socket.io


【解决方案1】:
  1. 通过以下方式设置要保护的套接字:

    • 设置安全标志 - 如您所写 ({secure: true})
    • 或者在创建服务器时使用 https 协议(而不是 http) - 这会自动将安全标志设置为 true
  2. 简化身份验证过程的好库是:https://github.com/auth0/socketio-jwt

【讨论】:

    【解决方案2】:

    编辑:当然,OP 在他们的其他答案中是正确的;更重要的是,如果 socket.io >1.0,你可以使用socket.io-express-session

    原答案:

    Socket.io 支持通过io.set('authorization', callback) 机制进行授权。请参阅相关文档:Authorizing。这是一个简单的示例(使用基于 cookie 的会话和连接/表达会话存储进行身份验证——如果您需要其他内容,只需实现另一个“授权”处理程序):

    var utils = require('connect').utils;
    
    // Set up a session store of some kind
    var sessionId = 'some id';
    var sessionStore = new MemoryStore();
    // Make express app use the session store
    app.use(express.session({store: sessionStore, key: sessionId});
    
    io.configure(function () {
        io.set('authorization', function (handshakeData, callback) {
            var cookie = utils.parseCookie(handshakeData.headers.cookie);
    
            if(!(sessionId in cookie)) {
                return callback(null, false);
            }
    
            sessionStore.get(cookie[sessionId], function (err, session) {
                if(err) {
                    return callback(err);
                }
    
                if(!('user' in session)) {
                    return callback(null, false);
                }
    
                // This is an authenticated user!
                // Store the session on handshakeData, it will be available in connection handler
                handshakeData.session = session;
    
                callback(null, true);
            });
        });
    });
    

    【讨论】:

      【解决方案3】:

      虽然 Linus 的回答基本上是正确的,但我现在使用 session.socket.io 以更简单的方式解决了它——它基本上做同样的事情,但需要编写的自定义代码更少。

      【讨论】:

        猜你喜欢
        • 2012-07-16
        • 2017-01-27
        • 1970-01-01
        • 1970-01-01
        • 2013-03-12
        • 1970-01-01
        • 2017-06-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多