Express和Socket.IO共享cookie

时间:2017-11-18 17:16:46

标签: node.js express cookies socket.io

成功验证用户后,会话数据被编码为访问令牌,然后使用以下代码设置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,它们包含令牌并且值是正确的。

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

1 个答案:

答案 0 :(得分:1)

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