Javascript 内容安全策略:无法在Chrome扩展中加载Google API

Javascript 内容安全策略:无法在Chrome扩展中加载Google API,javascript,google-chrome-extension,google-api,content-security-policy,Javascript,Google Chrome Extension,Google Api,Content Security Policy,这是一个相对的Chrome扩展。我正在尝试一个简单的,使用谷歌图表API 我在我的html文档“popup.html”中有这段代码,它是通过点击图标加载的 <!doctype html> <html> <head> <script type="text/javascript" src="js/libs/jquery-1.8.0.min.js"></script> <script type="text/javascript"

这是一个相对的Chrome扩展。我正在尝试一个简单的,使用谷歌图表API

我在我的html文档“popup.html”中有这段代码,它是通过点击图标加载的

<!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>

有什么想法吗?

只需使用
https
协议即可。您得到的错误是关于


请参阅本页的
放松默认策略部分。它提到,您只能将
HTTPS
chrome extension
,以及
chrome extension resource
,在过去的12个小时里,我一直在努力解决这个问题,最后终于让它发挥作用。为什么花了这么长时间?因为我被甩了好几次。首先,虚假线索:

  • “让它成为HTTPS”——没关系。我的Chrome扩展现在可以对不同的域进行常规HTTP调用,并且工作正常。(更新:进一步澄清,“使用https”神话的根源在于人们在脚本加载时往往会遇到类似的问题。如果您需要引入一个外部.js文件,那么是的,您需要修改您的内容\u安全\u策略,并包括适当的主机名,它似乎只接受https。请记住,这不同于为REST之类的内容使用外部主机名如前所述,这不需要修改内容安全策略,也不需要https。)

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

  • “弄乱扩展中的内容安全策略(CSP)字符串”-在清单版本2下,默认字符串工作正常:“script src'self';object src'self'”。您甚至不必显式地指定它。您需要的是将您试图从扩展中访问的域作为“权限”值包含在内

  • 解决方案:

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


    要解决这个问题,您真正需要阅读的页面如下:

    我在运行Augury chrome extension调试Angular应用程序时收到此错误[报告]。 禁用扩展,错误就会消失。这不会帮助正在编写扩展的人,但可能会帮助那些没有编写扩展的人

    [Report Only] Refused to load the script 'https://apis.google.com/js/googleapis.proxy.js?onload=startup' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-EagvF0PX1Z3gVL2Dka1hbA' 'unsafe-inline' 'strict-dynamic' https: http:". 'strict-dynamic' is present, so host-based whitelisting is disabled. Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.
    

    使用
    https:
    资源。Http资源永远不能被列入白名单。谢谢@Amaan它让它工作起来。。。几乎!我应该有另一个政策吗?即使现在谷歌API已经加载,我也无法启动它<代码>google.load(“可视化”,“1”,“{packages:[“corechart”,“table”]})拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src‘self’”。没有内联脚本!对事件改用
    document.getElementById('elementID').addEventListener
    。为您的js代码块添加一个
    popup.js
    文件。请参阅如何解决此问题的代码示例,特别是清单文件中的
    内容安全策略
    。@E.E.33此回购文件已过期,扩展名已失效,但它有一个清单文件,您可以签出:
    
    [Report Only] Refused to load the script 'https://apis.google.com/js/googleapis.proxy.js?onload=startup' because it violates the following Content Security Policy directive: "script-src 'report-sample' 'nonce-EagvF0PX1Z3gVL2Dka1hbA' 'unsafe-inline' 'strict-dynamic' https: http:". 'strict-dynamic' is present, so host-based whitelisting is disabled. Note that 'script-src-elem' was not explicitly set, so 'script-src' is used as a fallback.