我开发了一个使用YouTube数据API v2的Google Chrome扩展。我在清单中的权限字段看起来像这样,因为脚本被注入到youtube.com下的页面中,我还需要访问选项卡:
"permissions": ["tabs", "*://*.youtube.com/*"]
这也适用于当我做一个请求YouTube数据API v2,因为请求是做http://gdata.youtube.com/,所以它是相同的域。但现在我正在迁移到YouTube数据API v3,请求必须完成http://www.googleapis.com/youtube/v3/(注意HTTPS而不是HTTP也)。然而,令人惊讶的是,我的请求在没有添加任何新权限的情况下工作得很好。
我知道,我问的问题似乎不是问题,但就我个人而言,我认为我的软件中任何我不理解的行为都是问题。为什么会发生这种情况?我不应该添加一个权限,如"*://*.googleapis.com/*"
为了我的XMLHttpRequest请求到API的工作?
我也有一些猜测王关于这个:HTTP访问控制头。我的请求确实发送一个Origin
头值chrome-extension://myExtensionId
。来自API的答案还包含以下头:
Access-Control-Allow-Origin: chrome-extension://myExtensionId
但这可能是原因Chrome允许我做一个跨源XMLHttpRequest没有任何额外的权限定义在清单?不确定,显然这是没有记录在谷歌API, YouTube数据API v3或Chrome扩展开发人员文档的任何地方。
如果Chrome没有在清单中找到权限,它将请求视为正常请求。这意味着当设置了正确的CORS标头时,请求仍然会成功。否则,请求将因为同源策略而失败。
Google API JavaScript库明确提到对CORS的支持:
发出请求:选项3
Google api支持CORS。请访问CORS页面获取更多关于使用CORS提出请求的信息。
如果可能的话,我仍然建议将权限添加到manifest文件中。对于简单的请求,这不会带来任何好处。对于非简单请求,这将使请求数量减少一半:非简单请求之前总是有一个预飞行(OPTIONS)请求,该请求检查客户端是否被允许访问源。
通过将权限添加到manifest文件中,Chrome将不会退回到CORS,并且始终使用一个网络请求来完成请求。太棒了!
然而……如果您是已经部署的扩展的作者,那么您可能需要重新考虑一下。当新的源权限被添加到清单文件时,扩展名将被禁用,直到用户批准该扩展名。对话框中"删除扩展"one_answers"启用"并排显示,因此有可能失去用户。
如果您愿意,您可以通过使用可选权限来克服这个问题,该权限在选项页中激活。用外行语言清楚地解释这个选项将提高扩展的速度,并且不要忘记提及将请求额外的权限。