让我解释一下我的设置。我有多个域名,它们都是主域名的CNAME记录,例如example.com。
example.com -> serverIP
company1.example.com -> example.com
company2.example.com -> example.com
我基本上正在开发我们软件的白色标签版本,其中软件简单地检测referrer并知道加载哪些徽标和样式表资产。
所以这一切都很好,但是当socket。io尝试握手到它的url,看起来像http://company1.example.com/socket.io/1/?key=123456,在登录到应用程序时,请求挂起在挂起状态。在主域example.com上,一切都很好。不同之处在于,主域向套接字发送一个cookie。. io握手URL,而公司子域不握手。
有没有人对如何解决这个问题有任何想法?它似乎甚至没有到达服务器,几分钟后,等待的请求返回它无法完成。
我有一个类似的问题,发现问题来自我正在使用的JS客户端。我通过将withCredentials: true
添加到我的连接配置来解决这个问题。
import io from "socket.io-client";
const connectionObject = {
...,
withCredentials: true,
};
socket = io("http://127.0.0.1:5000" || "", connectionObject);
将cookie添加到对Socket服务器的调用中。
你有两个选择:
-
不要使用cookie进行身份验证。使用基于方法的令牌。一旦客户端连接到应用程序,只需发送身份验证令牌。您可以使用localstorage保存令牌,并且第一次,令牌可以由服务器嵌入到javascript或html中。
如果您想知道为什么不应该使用令牌,请阅读sockjs-node文档,该文档实现了类似于socket.io的东西
cookie是浏览器和http服务器之间的一种协议以域名标识。如果浏览器的cookie设置为特定的域,它将把它作为所有HTTP请求的一部分传递给主机。但是为了使各种传输工作,SockJS使用中间人
从目标SockJS域托管的iframe。这意味着服务器会接收来自iframe的请求,而不是来自真实域的请求。的iframe的域与SockJS的域相同。问题是任何网站都可以嵌入iframe并与之通信请求建立SockJS连接。使用cookies此场景中的授权将导致授予对SockJS通信与您的网站从任何网站。这是一个典型的CSRF攻击。基本上,cookie不适合SockJS模型。如果你想授权一个会话-提供一个唯一的令牌一个页面,将其作为第一件事通过SockJS连接发送并验证它在服务器端。实际上,这就是cookie的工作原理。
还可以查看这篇文章作为示例实现。
如果你仍然不相信,那么检查选项2:
-
继续使用cookies。但这可能行不通。升级到最新的套接字。io(0.9。X或1.x)。使用0.9。X设置origin配置属性。或者在1上。设置
CORS with socket.ioorigins
服务器选项。可设置为"*:*
"或"*example.com:*
"。