3

プライベート S3 バケットから JavaScript ファイルを取得するために AWS API に従おうとしています。ガイドはこちら: 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=

私の質問はこれです: この REST リクエストをブラウザ/jQuery 環境で 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 呼び出しは、S3 が GET パラメータとして渡すことをサポートしない限り、Web ページに追加された単なる動的 scrip タグであるため、JSON-P 呼び出しにヘッダーを追加することはできません。

JSON-P を使用している場合、クロスドメインの問題はもはや問題ではありません。有効な JS である限り、任意のドメインから Web ページに取り込むことができます。問題の S3 ファイルに誰でも閲覧できる権限があることを確認する必要があります。

それを行う最後の方法は、S3 がサポートする新機能である CORS (クロスドメイン ajax) で S3 バケットを有効にすることです。次に、バニラ ajax 呼び出しをクロスドメインで s3 バケットに実行し、追加のヘッダーを心のコンテンツに追加できます。

于 2013-02-07T23:47:03.527 に答える