Firefox扩展请求被解释为CORS

16

当我将我的Chrome扩展程序移植到Firefox Web扩展程序时,由于同源策略的阻止,我无法进行任何网络请求。

例如:

const headers = {"content-type": "application/json" };
window.fetch(myDomain + "/api/v3/token", { method: "GET", headers: headers });

出现以下错误:

enter image description here

有没有办法配置Firefox扩展程序,使其不考虑这些请求的CORS?相同的代码作为Google Chrome扩展程序完全正常工作。

即使请求发送到本地主机,这也是正确的。

我已经尝试使用jquery的$.ajax方法和axios库获得相同的结果(在Chrome中工作,在Firefox中无法工作),因此我认为问题并不局限于window.fetch API。

编辑:我知道我可以在服务器端添加CORS处理程序,但我试图避免这样做。为什么这在Chrome中可以工作而在Firefox中却不能呢?

编辑2:该扩展程序是弹出窗口。


Firefox中的WebExtensions API仍然存在许多错误,甚至在核心部分也是如此,因此也许这只是另一个错误。 - wOxxOm
当您在Firefox Scratchpad中执行相同的操作时(在Firefox中按Shift + F4),它是否有效? - Smile4ever
4个回答

8

1
将什么添加到哪里以何种方式? - Richard Barraclough

6

对于在2022年遇到此问题的任何人:

Chrome正在弃用manifest V2,转而使用v3。因此,您可能最终会使用

host_permissions: ["*://domain/*"]

截止到2022年4月份,Firefox尚未支持清单v3,您需要使用:

permissions: ["*://domain/*"]

然而

如果像我一样,当使用chrome时成功地指定了端口(例如http://localhost:4000/*),在firefox上将不起作用。相反,你需要使用http://localhost/*,这个方法可以同时适用于chrome和firefox。


4
需要澄清你的回答:根据https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Match_patterns#sect2文档,需要使用匹配模式`http://localhost/*`(不包括端口),并授予对任何端口的访问权限。目前,你的回答含糊不清(似乎你在Firefox中受到标准端口的限制)。 - Xan
是的,感谢您明确说明这一点。 我已经阅读了文档到这个部分:https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#host_permissions 但是没有深入研究匹配模式的细节,因为它在Chrome上运行良好。 值得指出的是,在“about:addons”用户界面中,权限被列为有效,并且在使用端口时没有引发任何警告,但随后被静默忽略。 - Maxime VAST
我 fn 爱你 <3 - dasfacc

2

针对使用"manifest_version": 3的Firefox扩展程序,有一些注意事项:

Firefox会为这些网络请求执行CORS预检请求,而Chrome则不会。

这可能会导致意外的行为,因为这些预检请求是HTTP OPTIONS请求。

您可能需要在服务器端点上添加OPTIONS方法。

您还可能需要设置服务器端点上的来源和标头。


2

我的Firefox扩展程序正在使用V3清单,即使在清单中配置了host_permissions属性,我仍然遇到了确切的CORS问题。

正如@Baccata这里提到的那样,似乎Firefox正在执行CORS预检请求,而Chrome则不会。

我通过向我的Go后端添加一些基本的CORS处理来解决了这个问题。

cors := cors.New(cors.Options{
  AllowedMethods: []string{http.MethodOptions, http.MethodHead, http.MethodGet, http.MethodPut, http.MethodDelete},
  AllowedHeaders: []string{"*"},
})

log.Fatal(http.ListenAndServe(":"+port, cors.Handler(router)))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接