Firefox提取API:如何在请求中忽略“ origin”标头?

Phi*_*ßen 6 firefox http cors firefox-addon-webextensions fetch-api

如果您在Firefox WebExtension中提出获取请求,它将自动设置“ origin”标头。例如,当我在WebExtensions中运行此代码时...

fetch('http://example.com/')
Run Code Online (Sandbox Code Playgroud)

...结果请求包含标头:“来源:moz-extension:// 539a0d5b-60d9-4726-b3de-27d6979edc26”

在Chromium中运行相同的代码不会设置标头。(更新:并非总是如此,因为Chrome可能还会添加标头:“ origin:chrome-extension:// ...”。)

是否可以选择不带“原点”的请求发送?


我在提取API中找不到选项。因此,到目前为止,我看到的唯一解决方案是使用webRequest API删除标头,但这似乎过于复杂。

Phi*_*ßen 6

origin当 WebExtension 使用 fetch API 发送请求时,Firefox 和 Chrome 都会自动填充标头。目前没有 API 选项可以阻止它。

如果您不希望出现这种行为,您有两种选择:

  1. 使用旧的XMLHttpRequest API而不是 fetch
  2. origin使用webRequest API手动剥离标头

选项 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"]
);
Run Code Online (Sandbox Code Playgroud)

要使用该 API,您需要将"webRequest""webRequestBlocking"添加到manifest.json.