当前位置: 代码迷 >> JavaScript >> WebSocket的fetch的“凭据:'include'”或XMLHttpRequest的“ withCredentials”是否等效?
  详细解决方案

WebSocket的fetch的“凭据:'include'”或XMLHttpRequest的“ withCredentials”是否等效?

热度:30   发布时间:2023-06-07 16:37:37.0

我正在设置一个提供身份验证和WebSocket接口的Web服务。 服务器的API需要跨域访问,并且仍要接收针对服务器域的cookie集。 fetch ,使用选项credentials: "include"是可行的,并且效果很好。 WebSocket是否具有等效功能?

基本上,我有一个在a.com运行的Node.js服务器:

let app = require("express")()
// ...
//headers
app.use((req, res, next) => {
  console.log(req.headers)
  console.log(req.protocol)
  // Allow multiple origins from config
  let origin = req.headers.origin
  if (config.allowedOrigins.includes(origin)) {
    res.setHeader("Access-Control-Allow-Origin", origin)
  }
  res.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization")
  res.setHeader("Access-Control-Allow-Methods", "GET,PUT,POST,PATCH,DELETE")
  res.setHeader("Access-Control-Allow-Credentials", true)
  res.setHeader("Access-Control-Expose-Headers", "X-Total-Count, Link")
  next()
})
// ...
app.ws("/", (ws, req) => {
  const sessionID = req.sessionID // should be the same sessionID for requests from all origins
  // ...
})
// ...

来自b.com上托管的Web应用程序:

let socket = new WebSocket("wss://a.com") // should include cookie from a.com

当我在本地对其进行测试并且一切都在localhost上运行时,此方法效果很好,但是当Web应用程序在其他域上运行时,此方法将失败。

我希望用户登录a.com ,但可以对来自b.com的WebSocket请求使用相同的会话。

我很感谢每个建议!

我现在已经知道了。 以下假设启用了第三方Cookie:

至少在我测试过的所有主要浏览器中,默认行为是将现有的cookie与WebSocket请求一起发送(即,完全按照我的要求)。 我遇到问题时所使用的浏览器是 。 勇敢者似乎有一个错误,即 。 因此,这首先不是问题,只是我所使用的特定浏览器中的错误。

但是,当第三方cookie被阻止时(就像Safari中默认设置的那样),我认为没有一种方法可以实现我想要实现的目标。

  相关解决方案