如何防止 Safari 在遵循 same-origin 重定向时放弃授权 header?

How to prevent Safari from dropping the Authorization header when following a same-origin redirect?

Safari 似乎在遵循 same-origin 301 重定向时删除 Authorization header。比如这段JS代码:

fetch("/api/endpoint-that-redirects", { headers: new Headers({ "Authorization": "sometoken" })})

将使用 Authorization header 触发一个 GET/api/endpoint-that-redirects,它以 301 和位置 /api/endpoint 响应。浏览器会自动执行此操作,这意味着它对 /api/endpoint 进行了另一个 GET,但这次 没有 Authorization header.

这似乎是重定向到 不同来源 时的预期行为,但如果重定向到另一个 URL,我不明白为什么会发生这种情况同源。

我在 Whosebug 上看到了很多关于这种行为的在线帖子和问题,但我还没有看到任何确定的解决方案,或者至少没有看到关于这种行为的解释。如果重定向到同一主机,other questions 中也不清楚。

Chrome (98) 和 Firefox (97) 都遵循重定向并在后续 GET 请求中包含 Authorization header。

根据编写的 Fetch 标准,这是一个错误。请参阅 HTTP-network-or-cache fetch 中的 httpRequest。每个 HTTP 请求基本上都是从输入请求的克隆开始的,其中包括所有 developer-set headers.

但是,对于 Authorization 的特定情况,an open issue 是否应该跨来源包含它。

Safari 15.4+(iOS 15.4、macOS 12.3)用户将不会再遇到此 Authorization 下降。

详细信息:此问题的修复实际上 merged into the WebKit/Safari code back in October 2021 but per comments at https://bugs.webkit.org/show_bug.cgi?id=230935#c18 直到 mid-March 2022 年才在 Safari 15.4 中发布。

因此,对于 15.4 之前的 Safari 版本的任何用户,此问题将继续发生——尚未升级到 iOS 15.4 或 macOS 12.3 的用户——但当前使用 Safari/iOS/macOS 的用户则不会.