1

我正在尝试解决在 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 连接正常进行
4

1 回答 1

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.

于 2013-10-23T23:10:30.217 回答