zorioの日記 このページをアンテナに追加 RSSフィード

2009-05-09

Amazon Product Advertising APIの認証の件

参考:http://chalow.net/2009-05-09-1.html

今後はOpenIDみたいにAWSシグネチャが要るとか。

rubyで書いてみた。

require "openssl"
require "base64"

key = "1234567890"
req = [
"AWSAccessKeyId=00000000000000000000",
"ItemId=0679722769",
"Operation=ItemLookup",
"ResponseGroup=ItemAttributes%2COffers%2CImages%2CReviews",
"Service=AWSECommerceService",
"Timestamp=2009-01-01T12%3A00%3A00Z",
"Version=2009-01-06"].join("&")

message = ["GET", "webservices.amazon.com", "/onca/xml", req].join("\n")

hash = OpenSSL::HMAC::digest(OpenSSL::Digest::SHA256.new, key, message)

print Base64.encode64(hash) 
#=> Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=

http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?rest-signature.html

のサンプルと合わない。

http://developer.amazonwebservices.com/connect/thread.jspa?threadID=31670&tstart=0

によると、サンプルが間違ってるんじゃね?って話みたい。

ちなみにopensslが古くてSHA256が使えない場合は、HMACの所だけ自前で書けばOK。

2009-06-01追記:ikeyとokeyの初期化バグってたので修正。2回目以降は正しく動かなくなっていた。

2009-07-04追記:まだ間違ってた。コメント欄参照。

require "digest/sha2"
#中略
IPAD = "\x36"# * 64
OPAD = "\x5c"# * 64
def hmac_sha256(key, message)
#  ikey = IPAD
#  okey = OPAD
  ikey = IPAD * 64
  okey = OPAD * 64
  key.size.times do |i|
    ikey[i] = key[i] ^ ikey[i]
    okey[i] = key[i] ^ okey[i]
  end

  value = Digest::SHA256.digest(ikey + message)
  value = Digest::SHA256.digest(okey + value)
end

print Base64.encode64(hmac_sha256(key, message)) 
#=> Nace+U3Az4OhN7tISqgs1vdLBHBEijWcBeCqL5xN9xg=

参考:

まあ、そんな事よりYahoo!PipesとかTomblooとかから使えなくなりそうなのが困るんですけどね。

nokinoki 2009/05/10 06:26 私はOpenIDのライブラリーを使ったのですが、サンプルの署名の値が同じになりました(データを取れることを確認済み)。だからAmazonの例が間違っているのだと思います。

zoriozorio 2009/05/10 07:14 そうかopenidって手がありましたか。

willnetwillnet 2009/07/04 23:36 hmac_sha256メソッドのコードですが
IPAD[i] -> ikey[i]
OPAD[i] -> okey[i]
の間違いではないでしょうか。

zoriozorio 2009/07/05 00:11 ご指摘の通りです。ローカルでは直したんだけど忘れてました。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証