【发布时间】: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