我正在设置同时提供身份验证和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请求使用相同的会话。
我很感谢每个建议!
答案 0 :(得分:0)
我现在已经弄清楚了。以下假设第三方Cookie已启用 :
至少在我测试过的所有主要浏览器中,默认行为是现有cookie将与WebSocket请求一起发送(即完全按照我的要求发送)。我在遇到问题时所使用的浏览器是Brave。勇敢者似乎有一个Cookies are not added to WebSocket connections的错误。因此,这首先不是问题,只是我正在使用的特定浏览器中的错误。
但是,当第三方cookie被阻止时(就像Safari中默认设置的那样),我认为没有办法实现我想要实现的目标。