【发布时间】:2019-08-08 10:27:11
【问题描述】:
我正在开发一个 Chrome 扩展程序,它可以从某些网站向我控制的 API 发出请求。在 Chrome 73 之前,该扩展程序可以正常工作。升级到 Chrome 73 后,我开始收到以下错误:
跨源读取阻塞 (CORB) 阻止跨源响应 http://localhost:3000/api/users/1,MIME 类型为 application/json
根据Chrome's documentation on CORB,如果满足以下所有条件,CORB 将阻止请求的响应:
资源是“数据资源”。具体来说,内容类型是HTML、XML、JSON
服务器以
X-Content-Type-Options: nosniff标头响应,或者如果省略此标头,Chrome 会通过检查文件检测到内容类型是 HTML、XML 或 JSON 之一CORS 未明确允许访问资源
另外,根据"Lessons from Spectre and Meltdown" (Google I/O 2018),似乎将mode: cors 添加到fetch 调用可能很重要,即fetch(url, { mode: 'cors' })。
为了解决这个问题,我做了以下更改:
首先,我将以下标头添加到我的 API 的所有响应中:
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Content-Type
Access-Control-Allow-Methods: GET, POST
Access-Control-Allow-Origin: https://www.example.com
其次,我更新了我对扩展程序的 fetch() 调用,如下所示:
fetch(url, { credentials: 'include', mode: 'cors' })
但是,这些更改不起作用。我可以进行哪些更改以使我的请求不会被 CORB 阻止?
【问题讨论】:
-
在 Google 的特定扩展文章中查看解决方案,该文章是 different。
-
我认为如果你发布一个答案可能会更好——也许还有一些你认为相关的额外细节——因为你对此有更多的了解。我只知道这篇文章,不知道具体内容。
-
虽然使用背景页面足以解决问题,但我仍然很困惑为什么 Chrome 会阻止我的扩展请求。 “更改 Chrome 扩展内容脚本中的跨域请求”一文写道,“为了减轻这些担忧,未来版本的 Chrome 将限制内容脚本与页面本身可以执行的相同获取。”这向我表明,跨域请求仍然可以从扩展中获得,但它们必须遵循 CORS。既然我将 CORS 标头添加到我的响应中,那么我的请求不应该成功吗?
-
我也有兴趣回答这个问题。启用了 NetworkService 的 Chrome 73 似乎只是不对从内容脚本发出的 xhr 请求发出 CORS 预检请求,即使该请求需要 CORS 并且如果从主机页面发出会触发预检请求。这可能是Chrome错误吗?根据文档,他们的目的是使内容脚本“遵守与它们在其中运行的页面相同的请求规则”。如果从页面发出的 x-origin 请求触发了预检,但来自内容脚本的请求却没有,这似乎破坏了这个意图
标签: google-chrome google-chrome-extension cors cross-origin-read-blocking