- Home ›
- Amazon Web サービス入門 ›
- JavaScriptを使った署名認証 ›
- HERE
完成形
広告
最後にAPIのバージョンを最新版の「2009-07-01」に変更し、リクエストの送信先を日本用である「ecs.amazonaws.jp」に変更しました。
またAccess KeyとSecret Keyを画面から入力できるように変更してあります。
URLエンコードに関してはencodeURIComponentだけでは不十分なものもあり、現在確認しているだけでも「(」「)」「!」は手動で変換しないと駄目でした。下記のコードではその部分を追加してあります。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja"> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> <title>署名認証テスト</title> <script type="text/javascript" src="./js/jssha256.js"></script> <script type="text/javascript" src="./js/base64.js"></script> <script type="text/javascript" src="./js/script7_1.js"></script> <link rel="stylesheet" href="./form.css" type="text/css" /> </head> <body> <div class="box"> <div class="subbox"><span>キーワード</span> <input type="text" name="keyword" class="text" id="keyword" /> </div> <div class="subbox"><span>アソシエイトID</span> <input type="text" name="associate_tag" class="text" id="associate_tag" /> </div> <div class="subbox"><span>AWS Access Key</span> <input type="text" name="access_key" class="text" id="access_key" /> </div> <div class="subbox"><span>Secret Access Key</span> <input type="text" name="secret_key" class="text" id="secret_key" /> </div> <div class="subbox"><span> </span> <input type="button" name="checkbutton" value="check" onclick="getSignature()" /> </div> </div> </body> </html>
function getSignature(){ var str_imestamp = getISO8601Timestamp(); var access_key = document.getElementById("access_key").value; var secret_key = document.getElementById("secret_key").value; var keyword = document.getElementById("keyword").value; var associate_tag = document.getElementById("associate_tag").value; var url = "ecs.amazonaws.jp"; var para = { "Service":"AWSECommerceService", "AWSAccessKeyId":access_key, "Operation":"ItemSearch", "ResponseGroup":"ItemAttributes", "Keywords":keyword, "AssociateTag":associate_tag, "ItemPage":"1", "SearchIndex":"Books", "Version":"2009-07-01", "Timestamp":str_imestamp }; var para_array = []; for(var pname in para){ var tmp = encodeURIComponent(para[pname]); tmp = tmp.replace("(", "%28"); tmp = tmp.replace(")", "%29"); tmp = tmp.replace("!", "%21"); para_array.push(pname + "=" + tmp); } para_array.sort(); var str_para = para_array.join('&'); var str_signature = "GET" + "¥n" + url + "¥n" + "/onca/xml" + "¥n" + str_para; HMAC_SHA256_init(secret_key); HMAC_SHA256_write(str_signature); var array_hash = HMAC_SHA256_finalize(); var str_hash = ""; for (var i = 0; i < array_hash.length; i++) { str_hash += String.fromCharCode(array_hash[i]); } var signature = Base64.encode(str_hash); var para_signature = "&Signature=" + encodeURIComponent(signature); location.href = "http://" + url + "/onca/xml?" + str_para + para_signature; } function getISO8601Timestamp(){ var d = new Date(); var ye = d.getUTCFullYear(); var mo = zeroPlus(d.getUTCMonth() + 1); var da = zeroPlus(d.getUTCDate()); var ho = zeroPlus(d.getUTCHours()); var mi = zeroPlus(d.getUTCMinutes()); var se = zeroPlus(d.getUTCSeconds()); return ye + "-" + mo + "-" + da + "T" + ho + ":" + mi + ":" + se + "Z"; } function zeroPlus(value){ return ("0" + value).slice(-2); }
上記を実際にブラウザ見てみると次のように表示されます。
必要項目を入力して「check」ボタンを押すと次のように表示されます。
XSLTで整形してませんのでXSLデータそのままですが、一応結果は取得できるようになりました。
( Written by Tatsuo Ikura )