是否有等效的 fetch "credentials: 'include'"或 XMLHttpRequest 的 WebSocket "withCredentials"?



我正在设置一个同时提供身份验证和WebSocket接口的Web服务。服务器的 API 需要可跨域访问,并且仍接收为服务器域设置的 cookie。在 fetch ,这可以通过选项credentials: "include"实现,并且效果很好。WebSocket有等效项吗?

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

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 请求一起发送(即完全按照我想要的方式发送(。我遇到问题时使用的浏览器是 勇敢.Brave似乎有一个错误,即Cookie没有添加到WebSocket连接中。所以这首先不是问题,只是我使用的特定浏览器中的错误。

当第三方 cookie 被阻止时(因为它们在 Safari 中是默认的(,我认为没有办法实现我想要实现的目标。

最新更新