让我解释一下我的设置。我有多个域名,这些域名都是主域名的CNAME记录,例如example.com。
example.com - >服务器IP
company1.example.com - > example.com
company2.example.com - > example.com
我基本上正在开发我们软件的白色标签版本,软件只是检测引荐来源并知道要加载哪些徽标和样式表资产。
所以这一切都很好,但是当socket.io试图握手它看起来像http://company1.example.com/socket.io/1/?key=123456的url时,请求在登录应用程序时挂起处于暂挂状态。在主域名example.com上,一切都很顺利。 dfference是主域将cookie发送到socket.io握手URL,而公司子域不发送。
有没有人对如何解决这个问题有任何想法?它似乎甚至没有到达服务器,几分钟后,挂起的请求返回它无法完成。
答案 0 :(得分:1)
你有两个选择:
不要使用Cookie进行身份验证。使用基于令牌的方法。客户端连接到应用程序后,只需发送身份验证令牌即可。您可以使用localstorage保存令牌,并且第一次,您的服务器可以将令牌嵌入到javascript或html中。
如果您想知道为什么不应该使用令牌,请从sockjs-node文档中读取此文档,该文档实现类似于socket.io的内容
Cookie是浏览器和http服务器之间的合同,并且是 由域名识别。如果浏览器设置了cookie 特定域,它会将其作为所有http请求的一部分传递给 主人。但为了使各种传输工作,SockJS使用了 中间人
从目标SockJS域托管的iframe。这意味着服务器将 接收来自iframe的请求,而不是来自真实域的请求。该 iframe的域与SockJS域相同。问题是 任何网站都可以嵌入iframe并与之沟通 - 和 请求建立SockJS连接。使用cookie 此方案中的授权将导致授予完全访问权限 SockJS通过任何网站与您的网站进行通信。这是一个 经典的CSRF攻击。基本上 - cookies不适合SockJS 模型。如果要授权会话 - 请提供唯一标记 一个页面,首先发送它作为SockJS连接和验证 它在服务器端。实质上,这就是cookie的工作方式。
同时检查this article as an example实施。
如果您仍然不相信,请检查选项编号2:
继续使用Cookie。这可能不起作用。升级到最新的socket.io(0.9.x或1.x)。使用0.9.x设置origin config property。或者在1.x set origins
服务器选项上。您可以将其设置为*:*
或*example.com:*
。
另请查看此问题:CORS with socket.io
答案 1 :(得分:1)
我遇到了类似的问题,发现问题出在我使用的 JS 客户端上。我通过在连接配置中添加 withCredentials: true
解决了这个问题。
这是它的样子
import io from "socket.io-client";
const connectionObject = {
...,
withCredentials: true,
};
socket = io("http://127.0.0.1:5000" || "", connectionObject);
这将 Cookie 添加到对我的套接字服务器的调用。