JavaScriptだけでAmazonのProduct Advertising APIへのリクエストの署名認証を実装するのはできないことはないが、秘密キーを隠すというのは無理がある。公式フォーラムでのAmazon側の解答ではプロクシならOKですよみたいな感じなので、プロクシCGIを作り、Asamashi09で利用しているPipeをそれ経由にしてやることにした。

プロクシCGIはただただしさんのamazon-auth-proxyをPerlでCGIモジュールを使って書き直したものを使っている。このCGIスクリプトに署名認証導入前のリクエストをそのまま投げてやれば良い。AWSAccessKeyIdは僕のアクセスキーIDに変更して署名を作成するので、特に変更する必要はない。

なおXREAのインストールされているPerlが5.6系なサーバーではURIモジュールが1.30と古くuri_escape_utf8()が無かったり、Digest::SHAモジュールがインストールされてなかったりするので、少し手を加えてやる必要がある。uri_escape_utf8()の実装はURIモジュールからコピーして来れば良い。Digest::SHAモジュールの代わりは、Digest::SHA::PurePerlモジュールをライブラリ・パスに置いてやるのが手っ取り早い。Perl 5.6系なXREAサーバーで動作するものも公開しておく。

また、ただただしさんのamazon-auth-proxyもRuby 1.8.7以上が必要(多分)で1.8.5なXREAサーバーではObject#tapSymbol#to_proc(open( uri, &:read ))のところでエラーになる(Ruby知らないのでググって調べただけ)ので、適当に書き換えてやる必要がある(参考: 今までの人生でRubyのコードを100行くらいしか書いたことがない人が動作するように書き換えたもの)。

署名認証については公式フォーラムでAmazon側が

よって、OSSのユーザ様それぞれにAPIのAccessKeyIDおよび秘密キーを利用開始時に入力いただくという方法を強くお勧めいたします。

と、かなり無理がありそうなことを言っていたりする。オープンソース・ソフトウェアのユーザーならアカウントの取得とかできない奴はいないだろうみたいな感覚なのかな。必ずしもオープンソースというわけではないがソースは公開されてしまうソフトウェアでかつユーザーの敷居がものすごく低いもの、例えばFirefoxの拡張とかではこの方法はかなり厳しい気がする。そもそもAPIレベルの変更でデベロッパーだけではなくエンド・ユーザーにも対処を要求するというのは馬鹿げていると思う。

中継プロクシによる署名認証の実装はユーザーに手間をかけさせずに対応できるのだけど、第三者に利用されまくるという問題がある。署名認証は「送信されたリクエストが誰によって送られたものかを確認するためのプロセス」であるということなので、第三者に利用されまくると意味をなさなくなってしまうんじゃないかなぁ。

署名認証はなかったことになりましたというアナウンスを心待ちにしている。誰でも使えるプロクシ実装はやっぱダメでしたとかいうアナウンスが出そうで怖い。