5

これが私がこれまでに持っているものです:

function sha256(stringToSign, secretKey) {
  return CryptoJS.HmacSHA256(stringToSign, secretKey);
} 

function getAmazonItemInfo(barcode) {

  var parameters = 
    "Service=AWSECommerceService&"
    + "AWSAccessKeyId=" + appSettings.amazon.accessKey + "&"
    + "Operation=ItemLookup&"
    + "ItemId=" + barcode
    + "&Timestamp=" + Date.now().toString();

  var stringToSign =
    "GET\n"
    + "webservices.amazon.com\n"
    + "/onca/xml\n"
    + parameters;

  var signature = "&Signature=" + encodeURIComponent(sha256(stringToSign, appSettings.amazon.secretKey));

  var amazonUrl =  
    "http://webservices.amazon.com/onca/xml?"
    + parameters
    + signature;

  // perform a GET request with amazonUrl and do other stuff

}

HTTP GET リクエストとして実行するとamazonUrl、上記のコードの の値により、Amazon から次のレスポンスが返されます。

<?xml version="1.0"?> 
  <ItemLookupErrorResponse xmlns="http://ecs.amazonaws.com/doc/2005-10-05/">
    <Error>
      <Code>SignatureDoesNotMatch</Code>
      <Message>
        The request signature we calculated does not match the signature you provided. 
        Check your AWS Secret Access Key and signing method. Consult the service 
        documentation for details.
      </Message>
   </Error>
   <RequestId>[REMOVED]</RequestId>
  </ItemLookupErrorResponse>

便利なリンク:

ItemLookup - 商品広告 API Amazon ドキュメント

REST リクエストの例

AWS 認証プロセス

CryptoJS

4

3 に答える 3

4

私はあなたのコードをハッキングして、それを機能させました。

function sha256(stringToSign, secretKey) {
  var hex = CryptoJS.HmacSHA256(stringToSign, secretKey);
  return hex.toString(CryptoJS.enc.Base64);
} 

function timestamp() {
    var date = new Date();
    var y = date.getUTCFullYear().toString();
    var m = (date.getUTCMonth() + 1).toString();
    var d = date.getUTCDate().toString();
    var h = date.getUTCHours().toString();
    var min = date.getUTCMinutes().toString();
    var s = date.getUTCSeconds().toString();

    if(m.length < 2) { m = "0" + m; }
    if(d.length < 2) { d = "0" + d; }
    if(h.length < 2) { h = "0" + h; }
    if(min.length < 2) { min = "0" + min; }
    if(s.length < 2) { s = "0" + s}

    var date = y + "-" + m + "-" + d;
    var time = h + ":" + min + ":" + s;
    return date + "T" + time + "Z";
}

function getAmazonItemInfo(barcode) {
    var PrivateKey = "";
    var PublicKey = "";
    var AssociateTag = "";

    var parameters = [];
    parameters.push("AWSAccessKeyId=" + PublicKey);
    parameters.push("ItemId=" + barcode);
    parameters.push("Operation=ItemLookup");
    parameters.push("Service=AWSECommerceService");
    parameters.push("Timestamp=" + encodeURIComponent(timestamp()));
    parameters.push("Version=2011-08-01");
parameters.push("AssociateTag=" + AssociateTag);

    parameters.sort();
    var paramString = parameters.join('&');

    var signingKey = "GET\n" + "webservices.amazon.com\n" + "/onca/xml\n" + paramString

    var signature = sha256(signingKey,PrivateKey);
        signature = encodeURIComponent(signature);

    var amazonUrl =  "http://webservices.amazon.com/onca/xml?" + paramString + "&Signature=" + signature;
    console.log(amazonUrl);
}

参考までに使用したJavascriptのヘッダー。

<script src="hmac-sha256.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/enc-base64-min.js"></script>
<script src="amazon.js"></script>

一部のパラメーターを変更し、「アプリ」オブジェクトを参照していないため、一部を変更する必要があります。

それを修正するために私がしたことについて(私が思い出すことができるものから)。

  1. パラメータはアルファベット順である必要があります。それらを配列に配置してから並べ替えました。アンパサンドとの結合によってこれをフォローアップします。

  2. sha256 関数を変更して、RAW sha256 の base64 を返しました。以前は、16 進ビットを小文字で返していましたが、これは正しくありません。

  3. エンコーディングの前に base64 を追加するつもりでしたが、sha256 がすべての署名を処理するようになりました。

  4. 日付の形式が正しくありませんでした。文字列のタイムスタンプではなく、エポックのタイムスタンプを返していました。簡単なタイムスタンプ オプションをまとめました。

    このコードには、CryptoJS 用の Base64 ライブラリも含める必要があります。

于 2014-03-23T06:18:17.537 に答える
1

AWS 用のこの Node.js ライブラリを使用します。Product Advertising API 専用の例も含まれています。

于 2014-03-23T07:27:19.277 に答える