簡體   English   中英

使用API​​從AWS S3獲取非公共JavaScript文件

[英]GET a non-public JavaScript file from AWS S3 using their API

我正在嘗試使用AWS API從私有S3存儲桶中獲取JavaScript文件。 該指南在此處: 簽署和驗證REST請求

環境是一個帶有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? 我在這里錯過了什么? 謝謝幫......

盡管此源是為PHP編寫的,但使用PHP的博客Amazon AWS S3查詢字符串身份驗證顯示了如何編譯普通的舊查詢字符串並將簽名作為參數傳遞給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

你去了,差不多是為你寫的整個香蕉。 我希望這可以幫助別人。

您不能將標頭添加到JSON-P調用,因為JSON-P調用只是附加到您的網頁的動態腳本標記,除非S3支持將其作為GET參數傳遞。

如果您使用的是JSON-P,則跨域問題不再重要。 只要有效的JS,它就可以從任何域名引入您的網頁。 您只需要確保有問題的S3文件具有任何人都可以查看的權限。

最后一種方法是使用CORS(跨域ajax)啟用S3存儲桶,這是S3支持的新功能。 然后你就可以將vanilla ajax調用跨域調用到你的s3存儲桶並為你的內容添加額外的標題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM