对于 WebSocket,是否有 fetch 的 "credentials: 'include'" 或 XMLHttpRequest 的 "withCredentials" 的等价物?
Is there an equivalent for fetch's "credentials: 'include'" or XMLHttpRequest's "withCredentials" for WebSocket?
我正在设置一个同时提供身份验证和 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 请求使用相同的会话。
感谢您的每一个建议!
我现在已经弄明白了。以下假设第三方 cookies 启用:
默认行为(至少在我测试过的所有主要浏览器中)是现有 cookie 将与 WebSocket 请求一起发送(即,完全按照我的要求发送)。我在遇到问题时使用的浏览器是 Brave. Brave seems to have a bug that Cookies are not added to WebSocket connections。所以这首先不是问题,只是我使用的特定浏览器中的错误。
当第三方 cookie 被阻止时(因为它们在 Safari 中默认设置),我认为没有办法实现我想要实现的目标。
我正在设置一个同时提供身份验证和 WebSocket 接口的 Web 服务。服务器的 API 需要可以跨域访问并且仍然接收为服务器域设置的 cookie。在 fetch
中,这可以通过选项 credentials: "include"
实现,并且效果很好。 WebSocket 是否有等效项?
基本上,我在 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 请求使用相同的会话。
感谢您的每一个建议!
我现在已经弄明白了。以下假设第三方 cookies 启用:
默认行为(至少在我测试过的所有主要浏览器中)是现有 cookie 将与 WebSocket 请求一起发送(即,完全按照我的要求发送)。我在遇到问题时使用的浏览器是 Brave. Brave seems to have a bug that Cookies are not added to WebSocket connections。所以这首先不是问题,只是我使用的特定浏览器中的错误。
当第三方 cookie 被阻止时(因为它们在 Safari 中默认设置),我认为没有办法实现我想要实现的目标。