【问题标题】:Express and Socket.IO shared cookiesExpress 和 Socket.IO 共享 cookie
【发布时间】:2018-05-02 07:16:15
【问题描述】:

用户认证成功后,将其会话数据编码为访问令牌,然后使用以下代码设置cookie:

res.set('Set-Cookie', cookie.serialize('access_token', token, {
    httpOnly: true,
    maxAge: 60 * 60 * 24 * 7 // 1 week
}));

稍后,用户尝试建立socket.io 连接,服务器尝试检索 cookie 数据:

io.on('connection', function(socket) {
    console.log("SOCKET CONNECTED");
    console.log(socket.handshake.headers.cookie);
    console.log(socket.request.headers.cookie);
});

输出

SOCKET CONNECTED
io=Y8-CmNDnIH1eOx0_AAAA
io=Y8-CmNDnIH1eOx0_AAAA

如您所见,cookie 仅包含一个名为 io 的属性,但不包含 access_token。虽然如果 cookie 是根据 express 请求读取的,它们包含令牌并且值是正确的。

为什么 express 请求中设置的 cookie 标头与 socket.io 上的不同。如何在 socket.io 和 express 之间共享 cookie?

【问题讨论】:

  • 您是否 100% 确定在创建 socket.io 连接之前设置了 cookie?您是否在其他快速请求中看到 cookie 以证明它存在?
  • 仅供参考,您可能希望使用 res.cookie() 设置 cookie,因为它内置在 Express 中。
  • 请记住,socket.handshake.headers.cookie 是最初建立 socket.io 连接时 cookie 的快照。新的 http 请求不会看到 cookie 的当前值。所以你的 cookie 必须在 socket.io 连接连接之前设置,以便在那里看到它。
  • socket.io 连接与设置 cookie 的主机名完全相同?
  • 客户端如何连接?它是否使用与设置 cookie 的网页完全相同的域?这就是我要问的。

标签: node.js express cookies socket.io


【解决方案1】:

要让 socket.io 连接看到您的 cookie,您必须将 socket.io 连接从客户端连接到与您设置 cookie 完全相同的主机名和端口(相同来源)。浏览器只会将之前保存的 cookie 发送到它们设置的完全相同的来源。例如,您不能在一个地方使用 IP 地址,而在另一个地方使用 locahost,即使它们解析到同一个物理服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2014-10-21
    • 2015-03-26
    • 2017-08-23
    • 2016-09-05
    • 2018-08-27
    • 2017-01-02
    相关资源
    最近更新 更多