【问题标题】:Is there an equivalent for fetch's "credentials: 'include'" or XMLHttpRequest's "withCredentials" for WebSocket?WebSocket 的 fetch 的“凭据:'include'”或 XMLHttpRequest 的“withCredentials”是否有等价物?
【发布时间】: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


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2012-04-29
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 2012-07-17
      相关资源
      最近更新 更多