我使用的身份验证使用HTTP基本(作为数据通过SSL加密连接发送的是罚款)基于Node.js的HTTPS服务器。
现在,我想提供一个Socket.io连接这应该是
- 加密和
- 只有通过验证的用户。
现在的问题是如何做到这一点。 我已经发现,我需要指定{ secure: true }
在连接到插座时,JavaScript代码的客户端,但我怎么迫使服务器端套接字连接只能通过SSL运行,并且它只能用于身份验证的用户?
我猜测,SSL事情是容易的部分,因为Socket.io服务器绑定到只有HTTPS服务器,所以应该只运行使用SSL,而且应该没有可能跑过来一个(另外)上运行的http服务器, 对?
至于我没有如何确保套接字连接丝毫的想法只能使用一次的用户使用HTTP基本认证成功设立了另一件事。
有任何想法吗?
Edit: Of course OP is right in their other answer; what's more, with socket.io >1.0 you might use socket.io-express-session.
Original answer:
Socket.io supports authorization via the io.set('authorization', callback)
mechanism. See the relevant documentation: Authorizing. Here's a simple example (this authenticates using a cookie-based session, and a connect/express session store -- if you need something else, you just implement another 'authorization' handler):
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);
});
});
});
虽然由Linus答案基本上是正确的,我现在解决它使用一个更简单的方法session.socket.io -基本上做同样的事情,但这样少的自定义代码来写。