内容安全政策:无法在Chrome扩展程序中加载Google API

Lau*_*ent 30 javascript google-api google-chrome-extension content-security-policy

这是相对于Chrome扩展程序.我正在尝试使用Google Chart API的简单版本

我在我的html文档"popup.html"中有这个代码,它是在Icon上点击时加载的.

<!doctype html>
<html>
<head>
  <script type="text/javascript" src="js/libs/jquery-1.8.0.min.js"></script>
  <script type="text/javascript" src="js/popup.js"></script>
  <script type="text/javascript" src="http://www.google.com/jsapi?key=xxxxxxxxxxx"></script>

  [...]
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我收到以下消息:

拒绝加载脚本"http://www.google.com/jsapi?key=xxxxxxxxxxx",因为它违反了以下内容安全策略指令:"script-src'sself'chrome-extension-resource:".

我知道它是相对于权限的东西,我试图修改我的Manifest文件,但没有成功:

{
  [...]
  "manifest_version": 2,
  "permissions": ["http://*.google.com/"],
  "content_security_policy": "script-src 'self' http://www.google.com; object-src 'self'",
}
Run Code Online (Sandbox Code Playgroud)

任何的想法?

fiv*_*git 28

在过去的12个小时里,我一直在努力解决这个问题,并最终让它发挥作用.为什么需要这么长时间?因为我多次被抛弃了.首先,假导线:

  1. "使它成为HTTPS" - 无关紧要.我的Chrome扩展程序现在可以定期对其他域进行HTTP调用,并且运行正常.(更新:更多澄清."make it https"神话根植于人们在SCRIPT加载时会遇到的类似问题.如果你需要引入一个外部.js文件,那么是的,你需要修改你的content_security_policy并包含正确的主机名,它似乎只接受https.请记住,这与点击REST服务之类的外部主机名不同.正如我之前所说,这不需要修改content_security_policy,也不需要修改https. )

  2. "在JQuery AJAX调用中使用JSONP" - 这可能是在普通网页中解决跨域AJAX的一种方法,但由于内置的​​内容安全策略,在chrome扩展中不是必需的.此外,实现JSONP听起来像PITA,因为它需要服务器端更改来处理回调参数(或者其他东西,我仍然不确定).无论如何,没有必要.

  3. "在扩展中使用内容安全策略(CSP)字符串" - 在清单版本2下,默认字符串工作正常:"script-src'self'; object-src'self'".您甚至不必明确指定它.您需要的是将您尝试从扩展名中搜索的域名包含为"权限"值.

解决方案:

从您的扩展程序中删除所有内联JavaScript.将其放入单独的.js文件中.我怀疑对于大多数具有任何相当数量的javascript的html文件,这个过程会很糟糕.对我来说幸运的是,我所拥有的只是一个onload,我可以将其作为window.addlistener onload事件移动到一个单独的js文件中.

您真正需要阅读以解决此问题的页面位于:https://developer.chrome.com/apps/contentSecurityPolicy


Som*_*Guy 22

只需让它使用https协议.您收到的错误与内容安全策略有关.

请参阅Relaxing the default policy页面部分.它提到,你只能白名单HTTPS,chrome-extensionchrome-extension-resource.