7

我有一个聊天,我需要管理独特的连接。我四处搜索,但我发现的所有解决方案似乎都已被弃用。

那么,如何使用 Socket.IO 获取套接字的会话 ID?

我正在使用Node.jsExpress.jsSocket.IO

4

1 回答 1

10

使用 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
});
于 2013-09-29T20:15:34.597 回答