2013-02-07 57 views
3

我试图按照AWS API从私有S3存储桶获取JavaScript文件。该指南是在这里:Signing and Authenticating REST Requests使用API​​从AWS 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中,我一直在寻找JSONP绕过同源策略,以s3.amazonaws.com通话。不过,我没有看到任何方式扩展头添加到jQuery的JSONP调用,并与AWS进行身份验证,你必须传递4号线:

Authorization: AWS AKIAJTURNBE6SXNTVVGQ:eWJOLZnj6Eja3CEC2CyifeURnxg= 

所以我的问题是:到底我该怎么办在我的浏览器/ jQuery环境中将此REST请求传输到AWS?我在这里错过了什么?由于团伙....

回答

4

虽然这个源是为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 

而且你去那里,几乎占据了整个香蕉为你写的。我希望这能帮助别人。

0

为JSON-P的呼叫只是附加到您的网页动态纸条标签,除非S3支持将它作为一个GET PARAM您不能添加标题为JSON-P的呼叫。

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

最后的方式做到这一点,是能够与CORS(跨域AJAX),这是一个新的功能S3支持你的S3桶。然后,您可以将香草ajax调用跨域到您的s3存储区,并为您的内容添加额外的标题。

+0

回复:您的评论“你只需要确保有问题的S3文件有可视许可任何人”,这正是我想通过使用Authorization头躲避。这是用户专用的内容。 –

+0

@GeekStocks,我刚刚给你答案,你不能用JSON-P调用设置标题,然后给出了使用和不使用开放权限的方法。你还想要什么? http://aws.amazon.com/about-aws/whats-new/2012/08/31/amazon-s3-announces-cross-origin-resource-sharing-CORS-support/ –

+0

的问题是“怎么了heck我传送这个REST请求...“,主题为”获取非公开JavaScript文件“。你的回答根本没有解决授权问题。你告诉我我不能做什么,而不是回答授权问题。 “我还想要什么”?我不知道,精度如何? –