2009年8月15日からAmazon Web Servicesを利用するときはアクセスキーだけではなく電子署名も埋め込む必要があるというメールが来ていた。
まあ、アクセスキーが分かれば誰でもリクエスト出来るというのは
いかがなものかなとは思っていたところだったので良いことかと。
と言うことで、電子署名をする方法をRubyで確認。
さて、このたび、Amazon アソシエイト Web サービスの名称を、「Product Advertising API」と変更しましたことをお知らせいたします。この新名称は、開発者の皆様が Amazon サイトで販売されている商品の広告作成を行い、これによって Amazon より広告費を受け取るという、API の目的をより正しく表しています。
名称変更にともない、Product Advertising API にリクエストを送信いただく都度、認証のための電子署名を含めていただくことが必要になります。この変更は、2009年5月11日より3ヶ月の間の移行期間の後、2009年8月15日には、Product Advertising API へ送信されるリクエストは全て認証されることとなり、認証されない場合、リクエストは処理されなくなります。
以前はリクエストのURIにアクセスキーを埋め込みさえすれば良かったけど
今度はsecret keyを使って認証しなければならないとのこと。
secret keyは「Product Advertising API」のアカウントにログインして
「Access Identifiers」で確認できる。
署名については以下のサイトを参考にした。
Amazon Product Advertising APIの認証の件 zorioの日記
Base64.encode64の文末に改行コードが入ることを知らずにいたことが原因で小一時間はまってしまった。
RubyのBase64エンコード ayucatのRuby/Rails日記
オフィシャルのマニュアル
Product Advertising API Request Authentication
require "cgi" require "openssl" require "base64" require "digest/sha2" require "time" aws_host = "webservices.amazon.co.jp" access_key = '00000000000000000000' secret_key = '1234567890' req = ["Service=AWSECommerceService","AWSAccessKeyId=#{access_key}", "Version=2009-06-01"] req << "ItemId=0679722769" req << "Operation=ItemLookup" req << "ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews" req << "Timestamp=#{CGI.escape(Time.now.getutc.iso8601)}" req.sort! message = ['GET',aws_host,'/onca/xml',req.join('&')].join("\n") hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, secret_key, message) sign = Base64.encode64(hash).split.join req << "Signature=#{CGI.escape(sign)}" url = "http://#{aws_host}/onca/xml?" + req.join('&') puts url
Perlについては小飼 弾さんの「404 Blog Not Found」を見ておけば大丈夫だ。
perl - URI::Amazon::APA released! 404 Blog Not Found