Amazon Product Advertising APIのための署名の付け方(Java)

2009年8月15日にAmazonの商品検索のためのAPIであるProduct Advertising API(旧称:AmazonアソシエイトWebサービス)の仕様が変更され、リクエストに署名認証を含めなければならなくなりました。

変更前は、「http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=アクセスキー&ItemId=4627847319&Operation=ItemLookup&ResponseGroup=Small&Service=AWSECommerceService」のようなURLをAmazonに投げればXML形式の結果が返ってきました(簡単!)。

新しい仕様では、パラメータTimestampを追加し、その結果できるURLと秘密鍵で作った署名をリクエストの末尾に付加しなければなりません。つまり、

  1. 従来のURL「http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=…」に、
  2. 「&Timestamp=タイムスタンプ」を追加し、
  3. その結果できるURLと秘密鍵で作った署名を、
  4. URLの末尾に付加する

というプロセスが必要になります(最終的なURLは「http://ecs.amazonaws.jp/onca/xml?AWSAccessKeyId=…&Timestamp=タイムスタンプ&Signature=署名」)。

署名を作るにはかなりの計算が必要なので、手でURLを書いて試してみるということはできなくなってしまいました。計算資源としてのクラウドをちゃんと管理したいということなのかもしれませんが、手軽さはなくなりました。

もちろん、一度プログラムを用意すれば、署名を付けること自体は簡単です。サンプルプログラムもあるので、プログラムの用意も簡単です。というわけで、「簡単」という結論のはずなのですが、気をつけないとはまってしまうかもしれません。というのは、

Developer Communityで配布されているサンプルプログラムが生成するURLでAmazonにアクセスしても、403エラー(アクセス不可)になってしまうのです。

解決方法をpmoosmanさんが指摘していました。

サンプルプログラムは、署名付きURLを作るためのクラスを定義するSignedRequestsHelper.javaと、その利用例であるItemLookupSample.javaからなりますが、SignedRequestsHelper.javaの、

Base64 encoder = new Base64();

となっているところは、

Base64 encoder = new Base64(0);

でなければなりません(参考:org.apache.commons.codec.binary.Base64)。

Product Advertising APIのウェブサイトに「Product Advertising API 開発者向けガイド リクエストの署名認証について(参考訳)」などという文書が用意されているのですが、そこに載っているサンプルにも同じ問題があるようです。

もちろんこのほかに、ItemLookupSample.javaの以下の部分を自分にあわせて書き直さなければ使えません。日本で利用する場合、ENDPOINTは「ecs.amazonaws.jp」でいいでしょう。

private static final String AWS_ACCESS_KEY_ID = アクセスキーID;
private static final String AWS_SECRET_KEY = 秘密鍵;
private static final String ENDPOINT = "ecs.amazonaws.jp";

あとの使い方はItemLookupSample.javaを見ればわかるでしょう。(Commons Codecをダウンロードして、commons-codec-バージョン番号.jarをCLASSPATHに追加する必要があります。すいません、面倒で。)

Timestampを含めると言っても、署名は15分有効です。うまくいかないときは、生成された署名付きのURLに、ウェブブラウザでアクセスしてみるといいかもしれません。

Product Advertising API自体については1年くらい前に「PHPでAmazon Web Servicesを利用する 」という記事を書きました。パラメータの使い方の説明などは今でも有効ですが、ここで紹介したような署名認証の話はまったくありませんから、「書いてあるとおりにやっても動かない」という困った事態が多発するような気がします。

お約束ですが、こういう話を基本から学びたいという方には、拙著『Webアプリケーション構築入門 実践!Webページ制作からマッシュアップまで 』(森北出版, 2011)がおすすめです。