【发布时间】:2013-10-05 15:15:42
【问题描述】:
我有一个聊天,我需要管理独特的连接。我四处搜索,但我发现的所有解决方案似乎都已被弃用。
那么,如何使用 Socket.IO 获取套接字的会话 ID?
我正在使用Node.js、Express.js 和Socket.IO。
【问题讨论】:
标签: javascript node.js express socket.io
我有一个聊天,我需要管理独特的连接。我四处搜索,但我发现的所有解决方案似乎都已被弃用。
那么,如何使用 Socket.IO 获取套接字的会话 ID?
我正在使用Node.js、Express.js 和Socket.IO。
【问题讨论】:
标签: javascript node.js express socket.io
使用 Socket.IO 身份验证设置,并将 cookie 从 Express 传递到 cookie 解析器中间件。解析 cookie 后,您可以获取客户端的会话 ID,并从会话存储中获取关联的会话,无论是内存故事还是其他类型的存储。
// we need to use the same secret for Socket.IO and Express
var parseCookie = express.cookieParser(secret);
var store = /* your MemoryStore, RedisStore, etc */;
io.set('authorization', function(handshake, callback) {
if (handshake.headers.cookie) {
// pass a req, res, and next as if it were middleware
parseCookie(handshake, null, function(err) {
handshake.sessionID = handshake.signedCookies['connect.sid'];
// or if you don't have signed cookies
handshake.sessionID = handshake.cookies['connect.sid'];
store.get(handshake.sessionID, function (err, session) {
if (err || !session) {
// if we cannot grab a session, turn down the connection
callback('Session not found.', false);
} else {
// save the session data and accept the connection
handshake.session = session;
callback(null, true);
}
});
});
} else {
return callback('No session.', false);
}
callback(null, true);
});
每次客户端尝试连接时,都会运行授权功能。它获取握手标头 cookie (handshake.headers.cookies),并将它们传递给 express.cookieParser()。 cookie 解析器然后找到会话 ID,然后在 store 中搜索关联的会话。然后,我们将关联的会话存储到handshake.session,所以我们可以这样访问它:
app.get('/', function(req, res) {
req.session.property = 'a value';
});
io.sockets.on('connection', function(socket) {
var session = socket.handshake.session;
session.property // a value
});
【讨论】:
express.sid,但您应该使用浏览器进行验证。
cookies 而不是cookie,抱歉排版错误。