Rubyで電子署名 Amazon アソシエイト Web サービス


Amazon Web Services

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」で確認できる。

amazon1

署名については以下のサイトを参考にした。
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

会社のある場所

会社のある場所について違和感があった。

このブログ記事をよんでようやく気づいた。

祐川 京子のブログ

会社のある場所は「所在地」なのに
「住所」と表記する人が意外と多いことに気付いた

そうか、会社のある場所は「所在地」と書けばよいのだ。
ずっと住所と書いてた気がする。