XMLHttpRequest成功没有明确权限?也许CORS?

cpr*_*ack 2 xmlhttprequest google-api youtube-api cross-domain google-chrome-extension

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

"permissions": ["tabs", "*://*.youtube.com/*"]
Run Code Online (Sandbox Code Playgroud)

这也适用于我向YouTube Data API v2发出请求,因为该请求是针对http://gdata.youtube.com/进行的,因此它是同一个域.但现在我正在迁移到YouTube Data API v3,请求必须完成http://www.googleapis.com/youtube/v3/(请注意HTTPS而不是HTTP).但令人惊讶的是,我的请求在没有添加任何新权限的情况下完美运行.

我知道,我问的是一些似乎不是问题的东西,但我个人认为我在软件中不理解的任何行为都是一个问题.为什么会这样?我不应该添加权限"*://*.googleapis.com/*",以便我的API的XMLHttpRequest请求工作?

我也有一些猜测:HTTP Access Control标头.我的请求会发送Origin带有值的标头chrome-extension://myExtensionId.API的答案还包含以下标题:

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

但这可能是Chrome允许我在没有清单中定义的额外权限的情况下进行跨源XMLHttpRequest的原因吗?不确定,显然在Google API,YouTube Data API v3或Chrome Extensions开发人员文档中没有记录.

Rob*_*b W 5

如果Chrome未在清单中找到该权限,则会将请求视为正常请求.这意味着当设置正确的CORS头时,请求仍将成功.否则,由于原始策略相同,请求将失败.

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

提出请求:选项3
Google API支持CORS.有关使用CORS发出请求的更多信息,请访问CORS页面.

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

通过向清单文件添加权限,Chrome不会回退到CORS,并始终使用一个网络请求来完成请求.大!
但是......如果您是已部署扩展的作者,您可能会再想一想.将新的原始权限添加到清单文件时,将禁用该扩展,直到用户批准该扩展名为止.对话框旁边显示"删除扩展名"和"启用",因此可能会丢失用户.

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