无法在Chrome应用中加载AWS开发工具包

时间:2014-11-04 18:06:32

标签: javascript amazon-web-services amazon-s3 google-chrome-app

我正在使用this example在Chrome应用中从Javascript写入S3存储桶,但似乎被权限阻止了。

我必须包含aws sdk的本地副本: <script src="assets/third-party/js/aws-sdk-2.0.22.min.js"></script>

否则我会得到: <script src="https://sdk.amazonaws.com/js/aws-sdk-2.0.22.min.js"></script> Refused to load the script <script path> because it violates the following Content Security Policy

AWS SDK库随后失败: window.localStorage is not available in packaged apps. Use chrome.storage.local instead.

我运气不好吗? @Amazon,你能为Chrome应用程序制作一个SDK版本吗?

1 个答案:

答案 0 :(得分:5)

我刚刚测试了将SDK嵌入到Google提供的hello-world示例应用中,我能够成功加载它并在我启用了CORS的Amazon S3存储桶中列出对象。

我确实收到window.localStorage警告,但请注意它是警告,如果您使用的是AWS.CognitoIdentityCredentials,则只会影响您(并且可以解决,请参阅这篇文章的结尾更多)。

  

我必须包含aws sdk的本地副本:<script src="assets/third-party/js/aws-sdk-2.0.22.min.js"></script>

没错,您必须在编写Chrome应用时嵌入外部内容。这是由Chrome的Content Security Policy引起的,它对可执行代码的来源有严格的规定。我建议您阅读Chrome应用开发者指南的“Handling External Content”部分,详细了解如何处理这些资源,以及如何沙箱化无法嵌入的内容。

附录:window.localStorage

修改:由于this change,因此在v2.0.23之后将不再需要此解决方法。

如果您碰巧需要AWS.CognitoIdentityCredentials,可以通过在SDK之前添加脚本标记来解决window.localStorage问题,如下所示:

<script type="text/javascript" src="localStorage.js"></script>
<script type="text/javascript" src="aws-sdk-2.0.23.min.js"></script>

localStorage.js文件只会重新定义localStorage并具有以下单行:

window.localStorage = {};

请注意,AWS.CognitoIdentityCredentials依赖于window.localStorage来尽可能地缓存您的Cognito身份ID。对于单页应用程序,缓存此ID的需求应该不那么重要,因此可以使用上述技术禁用。如果您确实需要缓存,可以查看AWS.CognitoIdentityCredentials API文档以获取身份ID并将其存储以供日后使用。您可能还希望撰写sandboxed app,这样您就可以使用window.localStorage以及引用外部内容和更轻松的CSP(如果需要)。