关于node.js:Express和Socket.IO共享cookie

Express and Socket.IO shared cookies

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

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

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

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

输出

1
2
3
SOCKET CONNECTED
io=Y8-CmNDnIH1eOx0_AAAA
io=Y8-CmNDnIH1eOx0_AAAA

如您所见,cookie仅包含一个名为io的属性,而没有包含access_token的属性。但是,如果在明确请求时读取了cookie,则它们包含令牌并且值正确。

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


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