我正在使用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版本吗?
答案 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(如果需要)。