WebSocket握手过程中是否不可能传递跨域cookie?

6

背景:

我正在本地开发一个前端应用程序,调用跨域的API等(从localhost开发服务器到我们内部网络中的另一台服务器)。由于我们的局域网是隔离的,后端服务器启用了CORS,这不会导致安全问题;但在生产环境中情况不同(CORS被禁用)。

我们在应用程序中引入了WebSocket连接,并为了使用授权而添加了cookie检查。 (XHR请求通过Authorization头授权,不使用cookie;但它们实际上可以使用;WebSocket接口仅允许一组有限的标头,并且如果我们不通过WS消息进行授权,则cookie似乎是唯一合理的选项;事实上,我无法找到是否可以实现基本HTTP身份验证而不使用浏览器标准提示,以及如何做到这一点)

问题:

尽管这在生产中实际上可以工作(当前端和后端位于同一个域时),并且cookie在握手请求中以Cookie头的形式发送(代码很简单:获取授权令牌后仅需设置cookie),但在开发环境中(localhost + 后端在另一个域名下)不起作用:握手中根本没有Cookie头。 上面的链接显示XHR需要withCredentials选项才能尝试跨域传递cookie;不过,我还没有找到WS是否有类似的东西的明确答案。 这里的一个类似问题的作者只是假设没有这样的东西,但真的是这样吗?


我没有任何见解可以提供,但我也遇到了同样的问题。我已经花了整整一天的时间搜索,但似乎找不到任何解决方法来允许您传递CORS WebSocket请求的cookie。看起来我们必须依赖浏览器像通常为WebSockets传递cookie一样传递cookie,但是除非您明确告诉它(通常使用withCredentials选项,就像您注意到的那样),否则浏览器不会这样做。 - SharpLizard
@SharpLizard 好的,我们最终在开发环境中停用了WS的身份验证;我认为使用WS消息本身来实现身份验证比使用cookies更加一致。 - YakovL
2个回答

2
请确保您正在使用的cookie设置了SameSite=None并且是安全的secure!我曾经遇到过相同的问题,认为cookie没有被发送,因为chrome检查器在websocket连接请求时不显示它们,但是只要您将它们标记为相同站点nonesecure,它们似乎就被发送了。或者,为了快速检查是否存在此问题,您可以在chrome://flags/中禁用SameSite要求。

好的,谢谢。我离需要这个代码的地方还有很远,所以不能立即检查它是否适用于我并接受,但我已经点赞表示这可能有帮助并值得尝试。 - YakovL

-1
在另一个项目中,我学习了一种“正确”的处理方法。通常使用较高级别的协议与WS一起使用,例如STOMP协议。它具有用于身份验证的特定实现,因此实际上不需要cookie;它没有CORS方面的缺点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接