成功验证用户后,会话数据被编码为访问令牌,然后使用以下代码设置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?
答案 0 :(得分:1)
对于要查看cookie的socket.io连接,您必须将socket.io连接从客户端连接到与您设置cookie的主机名和端口完全相同的主机名和端口(相同的源)。浏览器只会将以前保存的cookie发送到它们设置的完全相同的源。例如,即使他们解析到同一个物理服务器,您也无法在一个地方使用IP地址而在另一个地方使用locahost。