18

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

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

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

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

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

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

有任何想法吗?

4

3 回答 3

22

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

原答案:

Socket.io 支持通过该io.set('authorization', callback)机制进行授权。请参阅相关文档:授权。这是一个简单的示例(使用基于 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);
        });
    });
});
于 2013-01-30T13:38:33.080 回答
6

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

于 2013-11-16T10:10:03.133 回答
4
  1. 通过以下方式设置要保护的套接字:

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

于 2017-06-13T08:03:24.527 回答