このセクションでは、署名をどのように作成するか説明します。Product Advertising API では、バージョン2の署名のみサポートしています。
署名の作成方法
プロセスの後半で使用することになる、正規化されたクエリ文字列を作成します。
UTF-8クエリ文字列コンポーネントを、パラメータ名のマシンのネイティブのバイト順にソートします。
パラメータは、GET URIまたはPOST body (
Content-Type
が
application/x-www-form-urlencoded
の場合)から利用できます。
パラメータ名と値を、以下のルールに従って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のサービスパラメータの名称は非予約文字を使用していますので、これらをエンコードする必要はありません。しかし、将来必要な場合に備えて、予約文字を含むパラメータを処理できるコードを含めていただいた方がよいかもしれません。 |
パラメータの値が空値の場合でも、エンコードされるパラメータ名は、エンコードされる値と等号(=)(ASCII 文字 61)で分離します。
それぞれのパラメータ名・値のペアをアンド(&)(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のいずれかとなります。 |
作成したばかりのクエリ文字列を、RFC2104準拠のHMACで計算します。計算にあたっては、お客様の秘密キーをキーとして使用し、ハッシュアルゴリズムとしてSHA256を使用します。
詳細については、 http://tools.ietf.org/html/rfc2104 または http://www.ipa.go.jp/security/rfc/RFC2104JA.html をご参照ください。
結果の値を base64 に変換します。
結果として得られた値をリクエスト内のSignature
パラメータに含めて使用します。
![]() | 重要 |
---|---|
最終的にリクエストに含める署名は、RFC3986にて規定された方法でURLエンコードされている必要があります(詳細な情報については、http://tools.ietf.org/html/rfc3986) をご参照ください)。お客様のツールキットURLが最終的なリクエストをURLエンコードする場合は、必要な署名のURLエンコーディングも処理することになります。もしご利用のツールキットが最終的なリクエストのURLエンコード処理を行わない場合は、リクエストに署名を含めて送信する前に、必ずURLエンコードを行うようにしてください。最も重要なのは、署名のURLエンコードは 1度だけ行っていただく必要があるということです。よくある失敗は、マニュアルで署名のURLエンコード処理を行った後、再度ツールキットが全体のURLをエンコード処理してしまうというものです。 |