【问题标题】:Express cookieSession key not showing in data headersExpress cookieSession 键未显示在数据标题中
【发布时间】:2023-03-19 23:17:01
【问题描述】:

我正在尝试解决在 socket.io 中访问会话变量的臭名昭著的问题。我基本上已经阅读了谷歌上有关该主题的每个链接,但我仍在苦苦挣扎。

毕竟我的路线是这样的:

io.set('authorization', function(data,accept)
{
    data.cookie = cookie.parse(data.headers.cookie);
    ---> console.log(data.cookie);
    data.sessionID = connect.utils.parseSignedCookie(data.cookie['express.sid'].split('.')[0].substring(2), conf.sessionSecret);

    sessionStore.get(data.sessionID, function (err, session)
    {
        console.log(session);
    });
});

不幸的是,我画了一个箭头的console.log返回了这个:

{ 'connect.sid': 's:3pIi31DPthO8KVOjqzYpeL75.nHvKOpMZsUsyto7CtBJgcJZIiBSN+IC2/aD0GcfYftU' }

当然,我收到关于 express.sid 未定义的错误。 当我将 express.sid 更改为 connect.sid 时,我的会话变量未定义。

我真的很难解决这个问题 - 我已经解决了几个小时。有什么帮助吗?

编辑: 总结一下我解决的问题:

  1. 在 app.config 中我使用的是 cookieSession 而不是 session
  2. 我的客户端正在连接到我的服务器的端口转发的外部 ip 版本。这没有携带 cookie 数据。
  3. .split('.')[0].substring(2) 在查找 sessionID 时是绝对必要的
  4. 在 io.set('authorization, function (handshake,callback) ... 结束时必须调用 "callback(null,true)" 以使 socket.io 连接正常进行

【问题讨论】:

    标签: node.js session express connect socket.io


    【解决方案1】:

    你已经很接近了。在将 cookie 传递给解析器之前,您实际上不需要修改它。

    io.set('authorization', function(handshake, callback) {
      handshake.cookie = cookie.parse(handshake.headers.cookie);
      handshake.sessionID = connect.utils.parseSignedCookie(handshake.cookie['express.sid'], conf.sessionSecret);
    
      sessionStore.get(handshake.sessionID, function(err, session) {
        // the session would be here
      });
    });
    

    但是,由于您可以访问 cookie 解析器中间件,我个人会这样做:

    var parseCookie = express.cookieParser(conf.sessionSecret);
    io.set('authorization', function(handshake, callback) {
      if (handshake.headers.cookie) {
        parseCookie(handshake, null, function(err) {
          handshake.sessionID = handshake.signedCookies['express.sid'];
          sessionStore.get(handshake.sessionID, function(err, session) {
            // the session would be here
          });
        });
      }
    });
    

    此方法收集在解析 cookie 期间可能出现的任何错误,并通过将 handshake 对象作为 HTTP 请求对象传递来工作,因为它们都具有 headers.cookie 属性。然后 cookie 解析器将解析 cookie 并将它们分配给 handshake 对象,这样您就可以从 handshake.signedCookies 找到会话 ID。

    【讨论】:

    • 啊,是的,删除headers.cookie 部分。很抱歉这个错误,也将编辑示例。
    • handshake.signedCookies 为空。你知道为什么会这样吗?
    • 会话中间件的设置和完整的授权码。
    • 更新了我原来的帖子。非常感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-03-29
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-17
    相关资源
    最近更新 更多