保护Socket.io

我正在使用一个基于Node.js的https服务器,使用HTTP Basic进行身份validation(数据通过SSLencryption连接发送,这很好)。

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

  1. encryption和
  2. 仅限经过身份validation的用户。

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

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

关于另一件事,我没有丝毫的想法确保只有当用户使用HTTP Basic成功validation后才能build立套接字连接。

有任何想法吗?

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

原始答案:

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

 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); }); }); }); 

尽pipeLinus的回答基本上是正确的,但我现在用一个更简单的方法使用session.socket.io来解决这个问题 – 它基本上做了同样的事情,但是用更less的自定义代码来编写。

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

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