【问题标题】:Is it impossible to pass cookie cross domain with WebSocket handshake?用 WebSocket 握手传递 cookie 跨域是不可能的吗?
【发布时间】:2020-04-02 19:51:35
【问题描述】:

上下文:

我正在本地开发前端应用程序,跨域调用 API 等(从本地主机开发服务器到本地网络内另一台机器上的服务器)。由于我们的本地网络是隔离的,因此后端服务器启用了 CORS,不会导致安全问题;这在生产中有所不同(CORS 已禁用)。

我们在我们的应用程序中引入了 WebSocket 连接,为了通过授权保护它,我们在握手时添加了 cookie 检查。 (XHR 请求是通过 Authorization 标头授权的,此处不使用 cookie;但实际上使用了 canWebSocket interface 只允许 limited 一组标头,如果我们不通过 WS 消息授权,cookie 似乎成为唯一理智的选择;好吧,事实上我没有找到是否可以在没有浏览器标准提示的情况下实现基本 HTTP 身份验证,以及如何做到这一点)

问题:

虽然这实际上适用于生产(当前端和后端在同一个域上时),并且 cookie 在 Cookie 标头内的握手请求中发送(代码很简单:我只是在获得身份验证后设置了 cookie令牌),这在开发环境中不起作用(本地主机 + 另一个域上的后端):Cookie 标头在握手中不存在。 link above 表明XHR 需要withCredentials 选项来尝试跨域传递cookie;但是,对于 WS 是否有类似的东西,我还没有找到明确的答案。 Here 一个类似问题的作者只是假设没有这样的事情,但真的是这样吗?

【问题讨论】:

  • 我没有任何见解可提供,但我遇到了同样的问题。我花了一整天的时间搜索,似乎找不到任何解决方法来允许您为 CORS websocket 请求传递 cookie。似乎我们必须像通常用于 websockets 一样依赖浏览器来传递 cookie,但浏览器不会这样做,除非您明确告诉它(通常使用您提到的 withCredentials 选项)
  • @SharpLizard 好吧,我们最终在开发环境中为 WS 停用了身份验证;我会说使用 WS 消息本身而不是 cookie 来实现身份验证会更加一致

标签: javascript cookies websocket cross-domain


【解决方案1】:

仔细检查您正在使用的 cookie 是否设置为 SameSite=None 并且是 secure!

我遇到了同样的问题,认为 cookie 没有被发送,因为 chrome 检查器没有在 websocket 连接请求上显示它们,但它们似乎是一旦你用同一站点标记它们 nonesecure.

或者,要快速检查是否是问题所在,您可以禁用 chrome://flags/ 中的 SameSite 要求

【讨论】:

  • 对,谢谢,我离我需要的代码“很远”,所以不能立即检查这是否适合我并接受,但我赞成表明这可能是有帮助,值得尝试
【解决方案2】:

在另一个项目中,我学会了一种“正确”的方法来处理这个问题。通常与 WS 一起使用更高级别的协议,如 STOMP 协议。它对 auth 有特定的实现,因此实际上不需要 cookie;它在 CORS 方面没有缺点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多