3

我正在尝试遵循 AWS API 从私有 S3 存储桶获取 JavaScript 文件。指南在这里:签署和验证 REST 请求

环境是一个带有 jQ​​uery 的浏览器,所以这是一个 JavaScript 实现。我已经完成了我认为最困难的部分——用密钥签署请求。但现在我挂断了一些据说很容易的事情。我有这个生成的 REST 请求要传输:

GET /gss3/sayHello.js HTTP/1.1
Host: gss3.s3.amazonaws.com
Date: Thu Feb 07 2013 08:16:25 GMT-0500 (Eastern Standard Time)
Authorization: AWS AKIAJTURNBE6SXNTVVGQ:eWJOLZnj6Eja3CEC2CyifeURnxg=

由于这是从 www.mydomain.com 对 s3.amazonaws.com 的调用,因此我正在查看 JSONP 以绕过相同的来源策略。但是,我看不到任何方法可以向 jQuery JSONP 调用添加额外的标头,并且要通过 AWS 进行身份验证,您必须通过第 4 行:

Authorization: AWS AKIAJTURNBE6SXNTVVGQ:eWJOLZnj6Eja3CEC2CyifeURnxg=

所以我的问题是:我到底如何在我的浏览器/jQuery 环境中将此 REST 请求传输到 AWS?我在这里想念什么?谢谢大佬。。。。

4

2 回答 2

5

尽管此源代码是为 PHP 编写的,但博客Amazon AWS S3 Query String Authentication with PHP展示了如何编译一个普通的旧查询字符串并将签名作为参数传递给 S3。

$url .= '?AWSAccessKeyId='.$awsKeyId
.'&Expires='.$expires
.'&Signature='.$signature;

使用crypto-js并转换为 Javascript 然后给我们这样的东西:

var filePath = "/bucket/file.js";
var dateTime = Math.floor(new Date().getTime() / 1000) + 300; // allows for 5 minutes clock diff
var stringToSign = "GET\n\n\n" + dateTime + "\n" + filePath;
var signature = CryptoJS.enc.Base64.stringify(CryptoJS.HmacSHA1(stringToSign, secretAccessKey));
var queryString = "?AWSAccessKeyId=" + accessKeyId + "&Expires=" + dateTime + "&Signature=" + encodeURIComponent(signature);

var script = document.createElement("script");
script.type = "text/javascript";
script.src = "https://s3.amazonaws.com/bucket/file.js" + queryString;
$("head").append(script); // jQuery version

你去了,几乎整个香蕉都是为你写的。我希望这可以帮助某人。

于 2013-02-08T06:06:54.183 回答
0

您不能将标头添加到 JSON-P 调用,因为 JSON-P 调用只是附加到您的网页的动态脚本标记,除非 S3 支持将其作为 GET 参数传递。

如果您使用的是 JSON-P,那么跨域问题就不再重要了。只要它的有效 JS 可以从任何域拉入您的网页。您只需要确保有问题的 S3 文件具有任何人都可以查看的权限。

最后一种方法是使用 CORS(跨域 ajax)启用 S3 存储桶,这是 S3 支持的一项新功能。然后,您可以对您的 s3 存储桶进行 vanilla ajax 跨域调用,并为您的心脏内容添加额外的标头。

于 2013-02-07T23:47:03.527 回答