表达式 cookieSession 键未显示在数据标头中



我正在尝试解决在 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);
    });
});

不幸的是,控制台.log我画了一个箭头来返回以下内容:

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

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

我真的在努力解决这个问题 - 我已经工作了几个小时。有什么帮助吗?

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

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

你已经很接近了。实际上,在将 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。

相关内容

  • 没有找到相关文章

最新更新