amazon のAPIで認証が必要になる

2009/5/10 [10:36:02] (日) 天気

英文のメールが来ていたのは知ってた。ふーん、なんか変わるのか、ぐらいで流し…てたら、日本語のメールも来る。AWSという名称を変更するそうだ。

てのは、どうでもよくて、アマゾンにデータを取りにいくのに認証が必要になるらしい。それも5月11日から。猶予期間は3ヶ月ほどあるらしいけど、それまでにパラメータや認証キーを仕込みなおさないとまずいぢゃん。


当然ながら、今日時点では、ありがたく使わせていただけそうな例もまだないのでメモだけ。


新しくパラメータにTimestampが必要

RESTのURI+αを、SECRET KEYをキーにしてSHA256でHASHしてSignatureを生成してくっつける、らしい。

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

perl のDigest SHA

http://search.cpan.org/~mshelor/Digest-SHA-5.47/lib/Digest/SHA.pm


って、まだ全然わかってないんだけど。


use Digest::SHA qw(hmac_sha256_base64);

my $key = ’ABCD0987’;

my $data = ’aiueo12345xyz’;

my $digest = hmac_sha256_base64($data, $key);

print $digest;


認証のための署名はこれで作れる。


情報収集して対応しないといけません。


[05/11 10:56:47]

$digest .= ’=’ while length($digest) % 4;

4で割って余りが出ないように、「=」で埋める必要があるらしい。


http://blog.livedoor.jp/dankogai/archives/51211577.html


[05/11 23:46:32]

てことでチェックできた。

従来のURIにTimestampを追加。

Timestamp=2009-05-11T23:34:12Z

署名のためのデータを上記URIから作る。&でバラしてkeyをsortして並べ替えてURLエンコードしておく。


GET

webservices.amazon.co.jp

/onca/xml

上記URI


の4行のデータ。これをアマゾンの秘密鍵をキーに、SHA256でハッシュ化して署名を作る。

URIの最後にURLエンコードした署名をくっつけてできあがり(&Signature=署名)


と、エラソに書いたけど、ハマリがひとつ。何度やっても署名が間違ってる、と撥ねられて、しばし悶絶。あーだこーだパラメータをひとつずつ潰していったら、URLエンコードが原因でびっくりした。


今までずっと

s/(W)/sprintf("%%%02X",unpack("C", $1))/eg

とやっていて何も問題なかったんだよなあ。


# RFC3986

# URI の生成を行うものは

# ALPHA (%41-%5A と %61-%7A),

# DIGIT (%30-%39), hyphen (%2D),

# period (%2E), underscore (%5F), tilde (%7E)

# の範囲におけるパーセントエンコードされたオクテットを

# 生成すべきではない


ううううむ。てことで

s/([^0-9a-zA-Z~._-])/sprintf("%%%02X",unpack("C", $1))/eg

にしたら、無事通過。

ひっかかったのはTimestampの2009-05-11のハイフンあたりだったようだ。


とりあえずチェックスクリプトはこれでOKだったんで、週末にでも実装してしまおう。


参考:

http://docs.amazonwebservices.com/AWSECommerceService/latest/DG/index.html?BasicAuthProcess.html

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

↑こいつを見てたら、ハイフンがエンコードされてないんで、変だなあ、と。


<<2026/1>>
    123
45678910
11121314151617
18192021222324
25262728293031
検索:

【最近の20件】