我正在尝试使用AWS API从私有S3存储桶中获取JavaScript文件。指南在这里:Signing and Authenticating REST Requests
环境是一个带有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?我在这里错过了什么?谢谢帮派....
答案 0 :(得分: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
你去了,几乎整个香蕉都写给你。我希望这可以帮助别人。
答案 1 :(得分:0)
您无法将标头添加到JSON-P调用,因为JSON-P调用只是附加到您网页的动态脚本标记,除非S3支持将其作为GET参数传递。
如果您使用的是JSON-P,则跨域问题不再重要。只要有效的JS,它就可以从任何域名引入您的网页。您只需要确保有问题的S3文件具有任何人都可以查看的权限。
最后一种方法是使用CORS(跨域ajax)启用S3存储桶,这是S3支持的新功能。然后你就可以将vanilla ajax调用跨域调用到你的s3存储桶并为你的内容添加额外的标题。