- 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 )
AjaxTower