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

时间:2013-04-05 15:13:07

标签: javascript google-chrome google-chrome-extension google-chrome-devtools mixpanel

过去一天我一直在努力解决这个问题,在线整合Chrome扩展程序和Mixpanel的资源很少甚至没有。我希望在处理将Mixpanel集成到Chrome扩展程序时,人们可以参考此主题。

我的Mixpanel集成的目标是能够使用我的内容脚本content.js以及popup.js跟踪事件(基本上在我的整个扩展程序中)

我有一个popup.html文件,在<script src="mixpanel.js"></script>标记之前调用</head>

在我的mixpanel.js文件中:

(function(e,b){if(!b.__SV){var a,f,i,g;window.mixpanel=b;a=e.createElement("script");a.type="text/javascript";a.async=!0;a.src=("https:"===e.location.protocol?"https:":"http:")+'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js';f=e.getElementsByTagName("script")[0];f.parentNode.insertBefore(a,f);b._i=[];b.init=function(a,e,d){function f(b,h){var a=h.split(".");2==a.length&&(b=b[a[0]],h=a[1]);b[h]=function(){b.push([h].concat(Array.prototype.slice.call(arguments,0)))}}var c=b;"undefined"!==
typeof d?c=b[d]=[]:d="mixpanel";c.people=c.people||[];c.toString=function(b){var a="mixpanel";"mixpanel"!==d&&(a+="."+d);b||(a+=" (stub)");return a};c.people.toString=function(){return c.toString(1)+".people (stub)"};i="disable track track_pageview track_links track_forms register register_once alias unregister identify name_tag set_config people.set people.increment people.append people.track_charge people.clear_charges people.delete_user".split(" ");for(g=0;g<i.length;g++)f(c,i[g]);b._i.push([a,
e,d])};b.__SV=1.2}})(document,window.mixpanel||[]);

mixpanel.init("MY_TOKEN");

当我点击我的分机的按钮并检查它时,控制台输出以下错误:

Refused to load the script 'http://cdn.mxpnl.com/libs/mixpanel-2.2.min.js' because it violates the following Content Security Policy directive: "script-src 'self' https://cdn.mxpnl.com".

以下是我的manifest.json文件的权限部分:

"permissions": ["https://twitter.com/"],
  "content_security_policy": "script-src 'self' https://cdn.mxpnl.com; object-src 'self'"

扩展程序需要在Twitter上运行。

我已经阅读了Google撰写的Content Security Policy doc,这篇文章没有帮助

知道我在这里做错了吗?任何帮助将非常感谢!

3 个答案:

答案 0 :(得分:9)

此处的问题是Chrome不允许扩展程序加载remote resources over plain HTTP;只允许使用HTTPS:

  

由于中间人攻击对HTTP而言微不足道且无法察觉,因此不会接受那些[即http:]来源。

您的mixpanel.js脚本会尝试加载http://cdn.mxpnl.com/libs/mixpanel-2.2.min.js而不是相应的https:链接。要解决此问题,只需更改行:

a.src=("https:"===e.location.protocol?"https:":"http:")+'//cdn.mxpnl.com/libs/mixpanel-2.2.min.js'

为:

a.src='https://cdn.mxpnl.com/libs/mixpanel-2.2.min.js'

目前正在加载http:版本,因为window.location.protocolchrome-extension:,而不是https:。此更改只会强制加载https:版本。

答案 1 :(得分:3)

以上答案不完整。你还要做一件事。

第1步:添加HTTPS

执行其他答案告诉您的操作,更改mixpanel代码,更改 http://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js

第2步:修改manifest.json

中的内容安全性

更新content_security_policy中的manifest.json媒体资源: { ..., "content_security_policy": "script-src 'self' https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js; object-src 'self'", ... }

这样可以放宽默认的内容安全策略。

第3步[可选]:添加Google Analytics

如果您也想要Google Analytics,可以像这样添加: { ..., "content_security_policy": "script-src 'self' https://ssl.google-analytics.com https://cdn.mxpnl.com/libs/mixpanel-2-latest.min.js; object-src 'self'", ... }

我从Google自己的 how to add Google Analytics 教程中学到了如何做到这一点。

答案 2 :(得分:0)

您可以使用此脚本从自定义网址加载mixpanel。

<script>
  window.MIXPANEL_CUSTOM_LIB_URL = 'lib/mixpanel/mixpanel.js';
</script>