2

我开发了一个使用 YouTube Data API v2的 Google Chrome 扩展。我在清单中的权限字段如下所示,因为脚本是在 youtube.com 下的页面中注入的,我还需要访问选项卡:

"permissions": ["tabs", "*://*.youtube.com/*"]

当我向 YouTube Data API v2发出请求时,这也有效,因为请求是对http://gdata.youtube.com/完成的,所以它是同一个域。但是现在我正在迁移到 YouTube Data API v3,并且请求必须通过http://www.googleapis.com/youtube/v3/完成(注意HTTPS而不是 HTTP 也)。然而,令人惊讶的是,我的请求在没有添加任何新权限的情况下完美运行

我知道,我在问一些似乎不是问题的问题,但我个人认为我在软件中不理解的任何行为都是问题。为什么会这样?我是否不应该添加权限,例如"*://*.googleapis.com/*"为了使我的 XMLHttpRequest 请求对 API 起作用?

我对此也有一些猜测HTTP Access Control headers。我的请求确实发送了一个Origin带有 value 的标头chrome-extension://myExtensionId。API 的答案还包含以下标头:

Access-Control-Allow-Origin: chrome-extension://myExtensionId

但这可能是 Chrome 允许我在清单中未定义任何额外权限的情况下执行跨域 XMLHttpRequest 的原因吗?不确定,显然这在 Google API、YouTube 数据 API v3 或 Chrome 扩展开发者文档中的任何地方都没有记录。

4

1 回答 1

5

如果 Chrome 在清单中没有找到权限,它会将请求视为正常请求。这意味着当设置正确的CORS标头时,请求仍然会成功。否则,请求会因为同源策略而失败。

Google API JavaScript 库明确提到了对 CORS 的支持:

发出请求:选项 3
Google API 支持 CORS。请访问 CORS 页面以获取有关使用 CORS 发出请求的更多信息。

如果可能的话,我仍然建议将权限添加到清单文件中。对于简单的请求,这并没有带来任何好处。对于非简单请求,这将使请求数量减半:非简单请求之前总是有一个预检(OPTIONS)请求,该请求检查客户端是否被允许访问源。

通过将权限添加到清单文件中,Chrome 将不会回退到 CORS,并且始终使用一个网络请求来完成请求。伟大的!
但是……如果您是已经部署的扩展的作者,您可能会再想一想。当新的原始权限添加到清单文件时,扩展将被禁用,直到用户批准扩展。对话框显示“删除扩展”和“启用”并排显示,因此有可能失去用户。

如果您愿意,可以使用在选项页面激活的可选权限来解决此问题。用通俗的语言清楚地说明该选项将提高扩展的速度,并且不要忘记提及将请求额外的权限。

于 2013-03-02T09:39:36.960 回答