保护Socket.io

时间:2013-01-30 09:24:25

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

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

现在我想提供一个应该是

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

    我想SSL的事情很容易,因为Socket.io服务器只绑定到https服务器,因此它应该只使用SSL运行,并且不应该在(另外)运行它运行http服务器,对吧?

    关于另一件事我没有丝毫想过如何确保只有在用户使用HTTP Basic成功验证后才能建立套接字连接。

    有什么想法吗?

3 个答案:

答案 0 :(得分:16)

编辑:当然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);
        });
    });
});

答案 1 :(得分:7)

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

答案 2 :(得分:1)

  1. 设置要保护的套接字是通过以下方式完成的:

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