Socket.io没有在握手中发送cookie导致请求停止

时间:2014-05-25 03:03:43

标签: javascript node.js sockets websocket socket.io

让我解释一下我的设置。我有多个域名,这些域名都是主域名的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,而公司子域不发送。

有没有人对如何解决这个问题有任何想法?它似乎甚至没有到达服务器,几分钟后,挂起的请求返回它无法完成。

2 个答案:

答案 0 :(得分:1)

你有两个选择:

  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:

  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 添加到对我的套接字服务器的调用。