【问题标题】:CORS fetch authentication using Browser's session cookieCORS 使用浏览器的会话 cookie 获取身份验证
【发布时间】:2023-04-04 12:55:01
【问题描述】:

我有一个存储会话 cookie 的服务器,您可以使用在浏览器中运行的页面 (foo.com/login.html) 登录它。然后,浏览器会为此域存储一个会话 cookie。

现在我希望另一个页面 (bar.com) 在初始化时使用 JavaScript 向第一页 (foo.com/authenticate) 发出 GET 请求,该请求应检查浏览器中是否存在会话 cookie 并验证它是否正确他应该使用会话的用户名进行响应(但是这是从 cookie 中检索到的)。当然,如果存在 foo.com 的会话 cookie,我无法检查 bar.com 的 JavaScript。

为了解决这个问题,我遇到了一些问题,其中一个当然是 CORS。我设法通过在 foo.com 前面放置一个反向代理来避免这个问题,它将所有必需的 CORS 标头添加到响应中。除了添加标头之外,代理仅通过隧道传输请求(例如 rev-proxy.com/authenticate -> foo.com/authenticate)

现在,当我直接从另一个浏览器窗口(例如 rev-proxy.com/authenticate)通过 rev 代​​理调用处理程序时,我得到了正确的响应。来自 foo.com 后端的处理程序找到会话 cookie,读出用户名并将其传回。但是当我尝试在 bar.com (fetch("rev-proxy.com/authenticate")) 中从 JavaScript 进行相同的调用时,我收到 null,这意味着他没有找到 cookie(请注意,请求本身的状态为 200 ,这意味着它确实到达了 foo.com 的后端)。

我感觉我错过了浏览器如何使用 cookie 的关键点,但我找不到任何关于我的具体问题的有用信息,因为我认为这是一个相当不寻常的问题。

【问题讨论】:

  • 你应该提供一个真实的minimal reproducible example
  • 为什么首先使用代理?为什么foo.com/authenticate 本身没有返回正确的 CORS 标头? (如果您正在做的是一个预期的用例,那么任何“此时无法完成”的论点都是相当荒谬的,恕我直言。)
  • 你是对的,这很荒谬。但是添加代理实际上比添加标头要简单得多。我只能说 foo.com 的后端是一个外部服务,当你不想触及它的核心时,它是相当有限的。

标签: javascript google-chrome cookies cors session-cookies


【解决方案1】:

the MDN documentation:

fetch 不会发送 cookie,除非你设置了 credentials init 选项。 (自 2017 年 8 月 25 日起。规范将默认凭据策略更改为同源。Firefox 自 61.0b13 起更改。)

【讨论】:

  • 谢谢你成功了:我添加了credentials: 'include'并设置了Access-Control-Allow-Origin: bar.com
猜你喜欢
  • 2011-03-07
  • 2018-08-08
  • 2019-06-28
  • 2019-10-28
  • 1970-01-01
  • 2013-05-01
  • 2016-02-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多