在 websocket 握手上使用会话数据

2022-08-30 17:13:50

如果登录用户导航到要使用WebSockets的站点的某个区域,我如何获取该会话ID,以便在服务器上识别他?

我的服务器基本上是一个无休止的 while 循环,其中包含有关所有已连接用户和内容的信息,因此为了获取该 ID,我认为唯一合适的时刻是在握手时,但不幸的是,握手的请求标头不包含 cookie 数据:

请求标头

Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.5
Cache-Control: no-cache
Connection: keep-alive, Upgrade
DNT: 1
Host: 192.168.1.2:9300
来源:
Pragma: no-cache
Sec-WebSocket-Key: 5C7zarsxeh1kdcAIdjQezg==
Sec-WebSocket-Version: 13
升级: websocket
User-Agent: Mozilla/5.0 (Windows NT 6.1;哇64;rv:27.0) 壁虎/20100101 火狐/27.0http://localhost

那么我怎么能真正抓住那个ID呢?我想我可以以某种方式强制javascript发送cookie数据以及该请求,但是2014年任何自尊的网站都将具有httpOnly会话cookie,因此无法正常工作。任何帮助都非常感谢!

以下是我正在使用的服务器的链接:https://github.com/Flynsarmy/PHPWebSocket-Chat/blob/master/class.PHPWebSocket.php(感谢接受的答案)


答案 1

http only cookie 以及 secure cookie 适用于 websocket。

一些websocket模块选择忽略请求中的cookie,因此您需要阅读模块的规范。

尝试:websocket 节点:https://github.com/Worlize/WebSocket-Node

确保使用安全 websocket 协议作为 wss://xyz.com

更新:

此外,Chrome不会在“检查元素”网络选项卡中显示cookie。

在 node 中尝试转储请求,如下所示:

 wsServer.on('request', function(request) {
   console.log(request);
   console.log(request.cookies); // works in websocket node
 }

如果您在日志中的某个位置看到 Cookie...你得到了它。

如果您使用的是纯安全 Cookie,则需要使用安全的 Web 套接字:wss://

更新2:

Cookie 在初始请求中传递。Chrome不会(一直)显示它,因为有时它会显示临时标题,从而省略cookie信息。

由websocket服务器对cookie执行“某些操作”并将其附加到每个请求。

看看你的服务器的代码:https://github.com/Flynsarmy/PHPWebSocket-Chat/blob/master/class.PHPWebSocket.php 我在任何地方都看不到“cookie”这个词,所以它没有被很好地打包并附加到每个websocket连接上。我可能是错的,这就是为什么你可能想要联系开发人员,看看整个标头是否附加到每个连接以及如何访问它。

我可以肯定地说:如果您使用的是安全cookie,那么除非您使用安全网络袜子,否则cookie将不会被传输。平原将不起作用。wss://mysite.comws://mysite.com

此外,仅当域与网页相同时,才会在请求中传输 Cookie。


答案 2

推荐