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 中,这不再有效... @WilsonB​​iggs 我在 Firefox 69.0.1 上尝试过,但无法重现 XMLHttpRequest 现在设置了原始标头。但是我在附加到扩展时触发了来自调试控制台的请求。不过,我仍然通过 fetch 获得了原始标头。您使用的是较新的 Firefox 版本,还是要重现另一个转折?无论如何,如果选项 1 将停止工作,那将是令人遗憾的,因为并非所有扩展都有权使用 webRequest API。该 API 提供了强大的功能,仅为此目的添加它是很难证明的。 我认为问题出在其他问题上,因为在重写了我正在研究的内容之后,这不再发生了。很抱歉误报。

以上是关于Firefox fetch API:如何在请求中省略“origin”标头?的主要内容,如果未能解决你的问题,请参考以下文章

Firefox扩展请求被解释为CORS

如何使用 express js 处理 fetch API 请求

每次在 Node.js (Express.js) 中发出 API 请求之前,如何简化 Fetching Auth token?

使用 Fetch APi 时如何设置请求头的 content-type

服务器如何检测使用 fetch API 发出的请求?

如何使用 Angular 发送带有对象参数的 fetch api 请求?