websocket Socket.io 在握手时未发送cookie,导致请求停止

yshpjwxd  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(233)

让我解释一下我的设置。我有多个域名,都是一个主域名的CNAME记录,比如example.com。
example.com -> serverIP
company1.example.com -> example.com
company2.example.com -> example.com
我基本上是在开发我们软件的白色标签版本,软件只是检测引用者并知道要加载哪些徽标和样式表资产。
所以这一切都很好,但是当socket.io试图握手到它的url,看起来像http://company1.example.com/socket.io/1/?key=123456,请求挂起在一个挂起状态登录到应用程序。在主域名www.example.com上example.com,一切都很顺利。不同之处在于,主域将cookie发送到socket.io握手URL,而公司子域则不会。
有没有人知道如何解决这个问题?它看起来甚至没有到达服务器,几分钟后,挂起的请求返回它无法完成。

ssgvzors

ssgvzors1#

我也遇到了类似的问题,发现问题来自我正在使用的JS客户端。我通过在连接配置中添加withCredentials: true解决了这个问题。
这是它的样子

import io from "socket.io-client";

const connectionObject  = {
  ...,
  withCredentials: true,
};
socket = io("http://127.0.0.1:5000" || "", connectionObject);

这将Cookie添加到对我的套接字服务器的调用中。

mkshixfv

mkshixfv2#

你有两个选择
1.不要使用cookie进行身份验证。使用基于方法的标记。一旦客户端连接到应用程序,只需发送身份验证令牌。你可以用localstorage保存令牌,第一次,令牌可以由你的服务器嵌入JavaScript或HTML中。
如果您想知道为什么不应该使用令牌,请阅读sockjs-node文档,该文档实现了类似于www.example.com的内容socket.io
Cookies是浏览器和http服务器之间的协议,通过域名进行识别。如果浏览器为特定域设置了cookie,它会将其作为所有http请求的一部分传递给主机。但是为了让各种传输正常工作,SockJS使用了一个中间人
从目标SockJS域托管的iframe。这意味着服务器将接收来自iframe的请求,而不是来自真实的域的请求。iframe的域与SockJS域相同。问题是任何网站都可以嵌入iframe并与之通信-并请求建立SockJS连接。在这种情况下使用Cookie进行授权将导致从任何网站授予SockJS与您网站的完全访问权限。这是典型的CSRF攻击。基本上-cookie不适合SockJS模型。如果你想授权一个会话-在页面上提供一个唯一的令牌,首先通过SockJS连接发送它,并在服务器端验证它。从本质上讲,这就是Cookie的工作方式。
同时检查this article as an example的实现。
如果你仍然不相信,那么检查选项2:
1.继续使用cookies。但这可能行不通。升级到最新的socket.io(0.9.x或1.x)。使用0.9.x设置origin config属性。或在1.x上设置origins服务器选项。您可以将它们设置为*:**example.com:*
也检查这个问题:CORS with socket.io

相关问题