「Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ」というタイトルでメールが先月届いていましたが、面倒くさい感じがしていたので放置していました。
ですが、今後の為と思い、設定の練習をする事にしました。
参考にさせてもらったサイトは以下の通り
自分はPHPですが、方向性さえわかればいいという事でとりあえず探しました。
とりあえず、必要なのは
- Access Key ID
- Secret Access Key
- タイムスタンプを取得
- HMAC-SHA署名を作成する方法
というところでしょうか?
とりあえず、Access Key IDの確認・・・
Amazon Web Servicesにログイン後、Home > Your Account > Access Identifiersという階層に移動。
下に画像のような表示があるので、そこで確認。

暫く見に来てないだけにここまで探すのが大変だった・・・
とりあえず、サンプルに従ってテストしてみる。
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=自分のアクセスキーID&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Version=2009-01-06
これにタイムスタンプを付ける。
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=自分のアクセスキーID&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Version=2009-01-06&Timestamp=2009-01-01T12%3A00%3A00Z
書いていた皆さんサンプルのままでしたが、コレって現時間を表記するですかね?
やるなら、time関数とdate関数で直すべきなのかな?
とりあえず、テストで動作してみたらXMLの取得出来ました。
次が何のことやらサッパリ分からなかった「署名の文字列」・・・・・
なんでも、
1行目 GET
2行目 webservices.amazon.com
3行目 /onca/xml
4行目 AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookupResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceServiceTimestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06
というようにした上で、それらをハッシュ関数を使用して、認証コードを作成するそうです。
※ハッシュ関数(IT用語辞典)
自分の場合、PHPなんでそれに該当する関数を調べてみたらhash_hmac関数がありました。
公式マニュアルには・・・
Calculate an RFC 2104-compliant HMAC with the string you just created, your Secret Access Key as the key, and SHA256 as the hash algorithm.
アルゴリズムをSHA256にしてhash_hmac関数と言う事みたいです。
となると・・・
<?php
$data = “AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookupResponseGroup=ItemAttributes%2COffers%2CImages%2CReview
s&Service=AWSECommerceServiceTimestamp=2009-01-01T12%3A00%3A00Z&
Version=2009-01-06″;
$base = ”
GET\n
webservices.amazon.com\n
/onca/xml\n
“.$data;
$access_key = “自分のアクセスキーID”;
$hash = hash_hmac(“sha256″, $message,$access_key,”true”);
$enc = base64_encode($hash);
?>
4番目の”true”を設定する事で「生のバイナリデータ」になるそうです。
それをBase64方式でエンコードします。
最後に最初の方に書いたタイムスタンプまでのURLと合体させます。
http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=自分のアクセスキーID&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Version=2009-01-06&Timestamp=2009-01-01T12%3A00%3A00Z&Signature=pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D
面倒だな・・・・
このテストではOperationやらItemAttributesを固定の文字列で扱っちゃってるけど、実際の運用には配列と連結で対応してやったほうがいいんだろうな。
でも、自分で手順を書いておかないとそれこそ忘れてしまうので、書いておきました。