使用AWS S3的API从AWS S3获取非公共JavaScript文件

使用AWS S3的API从AWS S3获取非公共JavaScript文件,javascript,rest,amazon-s3,Javascript,Rest,Amazon S3,我试图遵循AWSAPI从私有S3存储桶获取JavaScript文件。指南如下: 该环境是一个带有jQuery的浏览器,因此这是一个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 Sta

我试图遵循AWSAPI从私有S3存储桶获取JavaScript文件。指南如下:

该环境是一个带有jQuery的浏览器,因此这是一个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?我错过了什么?感谢gang…

您不能向JSON-p调用添加标题,因为JSON-p调用只是附加到您的网页上的动态scrip标记,除非S3支持将其作为GET参数传递

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


最后一种方法是使用CORS(跨域ajax)启用S3 bucket,这是S3支持的一个新特性。然后,您可以跨域对s3 bucket进行普通ajax调用,并将额外的头添加到您的内容中。

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

$url .= '?AWSAccessKeyId='.$awsKeyId
.'&Expires='.$expires
.'&Signature='.$signature;
使用并转换为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

你看,几乎所有的香蕉都是为你写的。我希望这能帮助一些人。

re:您的评论“您只需要确保有问题的S3文件具有任何人都可以查看的权限”,这正是我使用授权头试图避免的。这是仅限订户使用的内容。@GeekStocks,我刚才给了你答案,你不能用JSON-P调用设置标题,然后给出了使用和不使用打开权限的方法。你还想要什么?问题是“我该如何传输这个REST请求…”,主题是“获取一个非公共JavaScript文件”。您的回答根本没有解决授权问题。你告诉我除了回答授权问题我不能做什么。“我还想要什么?”?我不知道,准确性如何?“最后一种方法是使用CORS(跨域ajax)启用S3存储桶,这是S3支持的一项新功能。然后,您可以跨域执行普通ajax调用,并将额外的头添加到S3存储桶中。”CORS,如果您愿意,用于解决浏览器需要进行飞行前检查的非javascript项目的公共桶跨域问题(文档使用web字体文件作为示例)。您不能使用CORS代替私有bucket的授权。