套接字.IO在握手时没有发送cookie,导致请求停止



让我解释一下我的设置。我有多个域名,它们都是主域名的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服务器的调用中。

你有两个选择:

  1. 不要使用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:

  2. 继续使用cookies。但这可能行不通。升级到最新的套接字。io(0.9。X或1.x)。使用0.9。X设置origin配置属性。或者在1上。设置origins服务器选项。可设置为"*:*"或"*example.com:*"。

    CORS with socket.io

相关内容

  • 没有找到相关文章

最新更新