Javascript Socket.io未在握手中发送Cookie,导致请求暂停

Javascript Socket.io未在握手中发送Cookie,导致请求暂停,javascript,node.js,sockets,websocket,socket.io,Javascript,Node.js,Sockets,Websocket,Socket.io,让我解释一下我的设置。我有多个域名,它们都是主域名的CNAME记录,例如example.com example.com->serverIP company1.example.com->example.com company2.example.com->example.com 我基本上是在开发我们的软件的白色标签版本,软件只是检测引用者并知道要加载哪些徽标和样式表资产 所以这一切都很好,但是当socket.io尝试与它的url握手时,请求在登录到应用程序时处于挂起状态。在主域名example.co

让我解释一下我的设置。我有多个域名,它们都是主域名的CNAME记录,例如example.com

example.com->serverIP

company1.example.com->example.com

company2.example.com->example.com

我基本上是在开发我们的软件的白色标签版本,软件只是检测引用者并知道要加载哪些徽标和样式表资产

所以这一切都很好,但是当socket.io尝试与它的url握手时,请求在登录到应用程序时处于挂起状态。在主域名example.com上,一切都很顺利。数据引用是主域向socket.io握手URL发送cookie,而公司子域不发送cookie

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

您有两个选择:

  • 不要使用cookies进行身份验证。使用基于令牌的方法。一旦客户端连接到应用程序,只需发送身份验证令牌。您可以使用localstorage保存令牌,并且首次可以通过服务器将令牌嵌入javascript或html中

    如果您想知道为什么不应该使用令牌,请阅读文档,文档实现了类似于socket.io的内容

    Cookie是浏览器和http服务器之间的契约,是 由域名标识。如果浏览器为设置了cookie 在特定域中,它将作为所有http请求的一部分传递给 主持人。但是为了让各种传输正常工作,SockJS使用 中间人

    从目标SockJS域托管的iframe。这意味着服务器将 从iframe接收请求,而不是从实际域接收请求。这个 iframe的域与SockJS域相同。问题是 任何网站都可以嵌入iframe并与之通信-以及 请求建立SockJS连接。使用cookies进行 在这种情况下,授权将导致授予完全访问权限 SockJS通过任何网站与您的网站进行通信。这是一个 经典的CSRF攻击。基本上-Cookie不适合SockJS 模型如果要授权会话,请在上提供唯一令牌 一个页面,将其作为第一件事通过SockJS连接发送并验证 它位于服务器端。本质上,这就是cookies的工作原理

    还要检查实现

    如果您仍然不确信,请检查选项2:

  • 继续使用cookies。但这可能行不通。升级至最新的socket.io(0.9.x或1.x)。使用0.9.x设置。或在1.x上设置
    origins
    server选项。您可以将它们设置为
    *:*
    *example.com:

    请检查此问题:


  • 我有一个类似的问题,发现问题来自我正在使用的JS客户端。我通过将
    with credentials:true
    添加到我的连接配置中解决了这个问题

    这是它的样子

    从“socket.io客户端”导入io;
    常量连接对象={
    ...,
    事实上,
    };
    套接字=io(“http://127.0.0.1:5000“| |”,连接对象);
    

    这为我的套接字服务器的调用添加了Cookies。

    处理授权的代码是什么?我建议停止基于cookie的授权,并将其更改为使用令牌。我将尝试删除cookie方法,但它看起来似乎还没有达到授权阶段。它实际上只是挂着,没有向前移动。我在握手和授权代码中添加了
    console.log
    语句,但它们甚至没有出现。更多信息:我刚刚得到一个对于example.com/socket.io/1/URL,没有“访问控制允许来源”。您知道如何允许该URL具有某些来源吗?@jrthib如果您使用的是Express,您可以查看中间件模块。您是否正确设置了socket.io的名称?试着将它设置为
    *:*
    ,看看它是否有效。非常感谢你花了两个小时来坚持这一点。