【问题标题】:Use session data on websocket handshake在 websocket 握手时使用会话数据
【发布时间】:2014-04-12 16:17:13
【问题描述】:

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

我的服务器基本上是一个无限的 while 循环,它包含有关所有连接的用户和东西的信息,所以为了获取该 id,我认为唯一合适的时刻是在握手时,但不幸的是,握手的请求标头不包含 cookie 数据:

请求标头

接受:text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
接受编码:gzip,放气 接受语言:en-US,en;q=0.5
缓存控制:无缓存
连接:保持活动,升级
DNT:1
主机:192.168.1.2:9300
来源:http://localhost
编译指示:无缓存
Sec-WebSocket-Key: 5C7zarsxeh1kdcAIdjQezg==
Sec-WebSocket-版本:13
升级:websocket
用户代理:Mozilla/5.0(Windows NT 6.1;WOW64; rv:27.0) Gecko/20100101 Firefox/27.0

那么我怎样才能真正抓住那个 id 呢?我以为我可以以某种方式强制 javascript 与该请求一起发送 cookie 数据,但 2014 年任何自尊的网站都会有 httpOnly 会话 cookie,因此不会成功。非常感谢任何帮助!

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

【问题讨论】:

  • 你为什么不把文件放在github而不是4shared?

标签: php session websocket


【解决方案1】:

http only cookie 以及安全 cookie 都可以在 websocket 上正常工作。

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

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

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

更新:

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

在节点中尝试转储请求,例如:

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

如果您在日志中的某处看到 cookie...您就知道了。

如果您使用仅安全 cookie,则需要使用安全的网络套接字:wss://

更新2:

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

由 websocket 服务器对 cookie 做“某事”并将它们附加到每个请求。

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

我可以肯定地说:如果您使用安全 cookie,那么除非您使用安全 websocket wss://mysite.com,否则 cookie 将不会被传输。普通的ws://mysite.com 将不起作用。

另外,只有域名与网页相同时,cookie才会在请求中传输。

【讨论】:

  • 很抱歉,我真的很想继续使用我当前的服务器。我认为问题不在于服务器,因为 request 标头中缺少 cookie,这些标头是从用户发送的:/
  • 您不会在 chrome 的请求标头中看到 cookie。你用的是什么服务器?
  • 我知道...您将不会在标题中看到 Cookie。根据您使用的 websocket 服务器 - 您在服务器上看到它们。
  • 找到它:github.com/Flynsarmy/PHPWebSocket-Chat 这个特定服务器似乎不支持 cookie。您可能想联系创建者,看看他是否有更新版本或使用不同的 websocket 服务器。
  • 就是这样!!!我使用192.168.1.2 作为websocket 地址服务器,但在浏览器中连接到localhost。谢谢楼主!!!!!!
猜你喜欢
  • 2016-05-25
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 1970-01-01
相关资源
最近更新 更多