【问题标题】:How to access session identifier when using Socket.IO?使用 Socket.IO 时如何访问会话标识符?
【发布时间】:2013-10-05 15:15:42
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript node.js express socket.io


    【解决方案1】:

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

    【讨论】:

    • 感谢您的帮助!但是我得到“TypeError:无法读取未定义的属性'connect.sid'”,你现在我做错了什么?
    • cookie 名称可能会有所不同。可能是express.sid,但您应该使用浏览器进行验证。
    • 使用 console.log(handshake.signedCookies);它显示“{}”,console.log(handshake.cookie) 显示“未定义”。我不知道我是否忘记添加一些东西。谢谢!
    • 实际上是cookies 而不是cookie,抱歉排版错误。
    • 工作正常!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 2011-01-30
    相关资源
    最近更新 更多