署名の作成方法

前のページ
1. プロセスの後半で使用することになる、正規化されたクエリ文字列を作成します。

A) UTF-8クエリ文字列の要素を、パラメータ名のマシンのネイティブのバイト順にソートします。
パラメータは、GET URIまたはPOST body (Content-Typeがapplication/x-www-form-urlencoded の場合)から利用できます。

B) パラメータ名と値を、以下のルールに従ってURLエンコードします。
RFC3986で規定された非予約文字はURLエンコードしてはいけません。非予約文字とは、A-Z, a-z, 09-, ハイフン(-)、アンダーバー(_)、ピリオド(.)およびチルダ(~)です。
拡張UTF-8文字については、%XY%ZA…のようにパーセントエンコードします。
スペース文字は、パーセントエンコードして%20と表記します(多くのエンコーディングで行われる、+は付加しないよう気をつけてください)
他の%XY (XおよびYにはHEX文字の0-9および大文字のA-Fが入る)で構成される文字についてもパーセントエンコードが必要です。

メモPerl におけるメモ: 一般に使われるURI:Escape CPANモジュールは、RFC2396を使用しています。ここでは、5つの追加予約文字が使用されています。アスタリスク(*)、右括弧(()および左括弧())、シングルクオート(’)およびエクスクラメーションマーク(!)。RFC3986を使用する場合は、以下をご利用ください: URI::Escape::uri_escape( $parameter_value, "^A-Za-z0-9\-_.~" )

メモJava におけるメモ: URLEncoderは、+をスペースとして使用し、アスタリスク(*)はエンコードせず、必要でない場合にもチルダ(~)をエンコードします。RFC3986を使用する場合は、以下をご利用ください:

URLEncoder.encode(value, UTF_8_Encoding).replace("+", "%20").replace("*", "%2A").replace("%7E", "~");

メモC#におけるメモ: 大文字のhex文字列をご利用ください。

ヒントヒント: 現状、全てのProduct Advertising APIのサービスパラメータの名称は非予約文字を使用していますので、これらをエンコードする必要はありません。しかし、将来必要な場合に備えて、予約文字を含むパラメータを処理できるコードを含めていただいた方がよいかもしれません。

C) エンコードされたパラメータ名称とエンコードされた値をイコール記号(=)(ASCIIコード61)で分割します。値が空値の場合でも同様の処理を行ってください。

D) それぞれのパラメータ名・値のペアをアンド(&)(ASCIIコード38)で分割します。

2. 署名用の文字列を以下の擬似文法に基づいて作成する(”\n”は、ASCIIコードの改行を示します)。

StringToSign = HTTPVerb + "\n" +

ValueOfHostHeaderInLowercase + "\n" +

HTTPRequestURI + "\n" +

CanonicalizedQueryString <from the preceding step>

HTTPRequestURI要素はURIのHTTP絶対パス要素ですが、クエリ文字列は含みません。HTTPRequestURIが空値の場合は、スラッシュ(/)を使用してください。

メモメモ: Product Advertising APIにおけるHTTPRequestURIは常に”/onca/xml”となります。HTTPVerbはGETまたはPOSTのいずれかとなります。

3. ステップ2)で作成したクエリ文字列を、RFC2104準拠のHMACで計算します。計算にあたっては、お客様の秘密キーをキーとして使用し、ハッシュアルゴリズムとしてSHA256を使用します。

詳細な情報については、

http://www.rfc.net/rfc2104.html

または

HMAC: メッセージ認証のための鍵付ハッシング

をご参照ください。

4. 結果をbase64に変換します。

5. ステップ4の結果得られた値をリクエスト内のSignatureパラメータに含めて使用します。

重要重要: 最終的にリクエストに含める署名は、RFC3986にて規定された方法でURLエンコードされている必要があります(詳細な情報については、http://www.rfc.net/rfc3986.htmlをご参照ください)。お客様のツールキットURLが最終的なリクエストをURLエンコードする場合は、必要な署名のURLエンコーディングも処理することになります。もしご利用のツールキットが最終的なリクエストのURLエンコード処理を行わない場合は、リクエストに署名を含めて送信する前に、必ずURLエンコードを行うようにしてください。最も重要なのは、署名のURLエンコードは1度だけ行っていただく必要があるということです。よくある失敗は、マニュアルで署名のURLエンコード処理を行った後、再度ツールキットが全体のURLをエンコード処理してしまうというものです。


次のページ

ご意見をお寄せください。

アソシエイト・セントラルについてのご提案やご意見は こちら