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?
- 您是否100%确定在创建socket.io连接之前已设置cookie?您是否在其他明示请求中看到cookie以证明它在那里?
-
仅供参考,您可能要使用res.cookie()来设置cookie,因为它是Express内置的。
-
请记住,socket.handshake.headers.cookie是最初建立socket.io连接时的cookie快照。它不是新的http请求将看到的cookie的当前值。因此,必须在连接socket.io连接之前设置cookie,以便在那里查看它。
-
我完全确定在设置cookie后就建立了套接字连接
-
然后,您需要验证另一个快递请求上是否存在cookie,以确保您正确设置了cookie。
-
好了,在设置了cookie之后-客户端被重定向到一个路径,在该路径中记录cookie值(正确),然后才建立套接字连接。完成所有这些操作后,我可以终止服务器并再次启动它。 cookie值(不进行重置)在express.so中将保持正确,并且在socket.io中不完整。所以我也很确定
-
然后将socket.io连接设置为与设置Cookie完全相同的主机名?
-
好吧,这就是我初始化app = express(); server = http.createServer(app); io = require('socket.io')(server);的方式,所以我相信-是的。同样在客户端,我尝试将套接字主机设置为http://127.0.0.1:9639,http://localhost:9639,并且未定义它,但是在所有情况下我都得到相同的结果。
-
客户端如何连接?是否使用与设置Cookie的网页完全相同的域?这就是我要的。
-
让我们继续聊天中的讨论。
要使socket.io连接看到您的cookie,您必须使从客户端到与设置cookie的主机名和端口(源相同)的socket.io连接完全相同。浏览器只会将先前保存的Cookie发送到与设置时完全相同的来源。例如,即使它们解析为同一台物理服务器,也不能在一个位置使用IP地址,而在另一个位置使用locahost。