2009年05月09日

「Subject: Amazon アソシエイト Web サービスの名称変更および署名認証についてのお知らせ」のツール側対応作業

表題SubjectのメールがAmazonからきてるんだけど(いくつかのサービスで利用してるので)、名称変更はどうでもいいとして、8月15日以降はリクエストアクセスの電子署名を付けないといけなくなるようだ。一般ユーザにはほぼ関係のないことではあるが、Amazonにアクセスして何かサービスに転換する(たとえばブログ記事に貼り込ませる機能を提供する)のが必要な人にはいろいろ頭が痛いことになりそう。 ガイドはあるものの、とても……面倒です。署名には、開発鍵を作ったときに一緒に作成された秘密鍵を使うことになる。開発鍵だけを受け取って運用してたようなサービスでは対応が大変そうだなぁ。以下RESTful版のガイドを適当に訳。

ItemLookupするのに「http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes,Offers,Images,Reviews&Version=2009-01-06」としてるとする。

  1. アクセス時間を示すタイムスタンプ属性をまず追加(とりあえずGMTで「2009-01-01T12:00:00Z」)。「http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes,Offers,Images,Reviews&Version=2009-01-06&Timestamp=2009-01-01T12:00:00Z」
  2. リクエストのコンマやコロンをURLエンコード(%〜)化。「http://webservices.amazon.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=00000000000000000000&Operation=ItemLookup&ItemId=0679722769&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Version=2009-01-06&Timestamp=2009-01-01T12%3A00%3A00Z」
  3. &で区切られているパラメータ=値 のペアに内部的に分割(&は取る)。
    Service=AWSECommerceService
    AWSAccessKeyId=00000000000000000000
    Operation=ItemLookup
    ItemId=0679722769
    ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews
    Version=2009-01-06
    Timestamp=2009-01-01T12%3A00%3A00Z
  4. パラメータを辞書順に並べ変える。
    AWSAccessKeyId=00000000000000000000
    ItemId=0679722769
    Operation=ItemLookup
    ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews
    Service=AWSECommerceService
    Timestamp=2009-01-01T12%3A00%3A00Z
    Version=2009-01-06
  5. &でつなげ直す。これで署名可能な文字列になった。「AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06」
  6. 次のような文字列(改行付き)を作成する。
    "GET
    webservices.amazon.com
    onca/xml
    AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06"
  7. RFC2104のHMAC-SHA256アルゴリズムと秘密鍵で、上記の文字列の署名ハッシュを作成する。「pwqYQRc3RepIrf7m+VMRy/jFXx/ZBSPsaSFFexIUoSI=」(秘密鍵が1234567890だった場合)
  8. +、=、/などをURLエンコードする。「pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D」
  9. 上記のエンコード済み署名をリクエストにSignatureパラメータで付加する。「http://webservices.amazon.com/onca/xml?AWSAccessKeyId=00000000000000000000&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews&Service=AWSECommerceService&Timestamp=2009-01-01T12%3A00%3A00Z&Version=2009-01-06&Signature=pwqYQRc3RepIrf7m%2BVMRy%2FjFXx%2FZBSPsaSFFexIUoSI%3D」

blosxom Kitのawsxsomを直すのだるいな…。あと社内でも独自のサービス作ってるんだが、これも直さないといけないようだ(こっちはRubyだしわりと楽めではあるが)。