Firefox fetch API:如何在请求中省略“origin”标头?
Posted
技术标签:
【中文标题】Firefox fetch API:如何在请求中省略“origin”标头?【英文标题】:Firefox fetch API: How to omit the "origin" header in the request? 【发布时间】:2018-05-01 13:38:40 【问题描述】:如果您在 Firefox WebExtension 中发出 fetch 请求,它将自动设置“origin”标头。例如,当我在 WebExtensions 中运行此代码时...
fetch('http://example.com/')
...生成的请求包含标头: "来源:moz-extension://539a0d5b-60d9-4726-b3de-27d6979edc26"
在 Chromium 中运行相同的代码不会设置标头。 (更新:并非总是如此,因为 Chrome 可能还会添加标题:“origin: chrome-extension://...”。)
是否可以选择在没有“来源”的情况下发送请求?
我没有在 fetch API 中找到选项。所以,到目前为止,我看到的唯一解决方案是使用 webRequest API 删除标头,但这似乎过于复杂。
【问题讨论】:
【参考方案1】:当 WebExtension 使用 fetch API 发送请求时,Firefox 和 Chrome 都会自动填充 origin
标头。目前没有 API 选项可以阻止它。
如果您不希望这种行为,您有两种选择:
-
使用旧的 XMLHttpRequest API 代替 fetch
使用webRequest API 手动剥离
origin
标头
选项 1 将起作用,因为 origin
标头仅由 fetch API 设置。对于选项 2,您必须安装 onBeforeSendHeaders
处理程序以在请求离开浏览器之前删除标头:
function originWithId(header)
return header.name.toLowerCase() === 'origin' &&
(header.value.indexOf('moz-extension://') === 0 ||
header.value.indexOf('chrome-extension://') === 0);
chrome.webRequest.onBeforeSendHeaders.addListener(
(details) =>
return
requestHeaders: details.requestHeaders.filter(x => !originWithId(x))
,
urls: ["<all_urls>"],
["blocking", "requestHeaders"]
);
要使用 API,您需要将 "webRequest"
和 "webRequestBlocking"
添加到 manifest.json
中的权限。
【讨论】:
看来 Firefox 现在无论如何都会将 origin 标头添加到 XMLHttpRequests 中,这不再有效... @WilsonBiggs 我在 Firefox 69.0.1 上尝试过,但无法重现 XMLHttpRequest 现在设置了原始标头。但是我在附加到扩展时触发了来自调试控制台的请求。不过,我仍然通过 fetch 获得了原始标头。您使用的是较新的 Firefox 版本,还是要重现另一个转折?无论如何,如果选项 1 将停止工作,那将是令人遗憾的,因为并非所有扩展都有权使用 webRequest API。该 API 提供了强大的功能,仅为此目的添加它是很难证明的。 我认为问题出在其他问题上,因为在重写了我正在研究的内容之后,这不再发生了。很抱歉误报。以上是关于Firefox fetch API:如何在请求中省略“origin”标头?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 express js 处理 fetch API 请求
每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?