【发布时间】:2019-02-14 21:24:28
【问题描述】:
我正在设置一个提供身份验证和 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 请求。
感谢每一个建议!
【问题讨论】:
标签: javascript cookies websocket cross-domain