【发布时间】: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