RESTリクエストの認証方法

このセクションでは、署名をどのように作成するか説明します。Product Advertising API では、バージョン2の署名のみサポートしています。

署名の作成方法

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

    1. UTF-8クエリ文字列コンポーネントを、パラメータ名のマシンのネイティブのバイト順にソートします。

      パラメータは、GET URIまたはPOST body ( Content-Typeapplication/x-www-form-urlencodedの場合)から利用できます。

    2. パラメータ名と値を、以下のルールに従って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のサービスパラメータの名称は非予約文字を使用していますので、これらをエンコードする必要はありません。しかし、将来必要な場合に備えて、予約文字を含むパラメータを処理できるコードを含めていただいた方がよいかもしれません。

    3. パラメータの値が空値の場合でも、エンコードされるパラメータ名は、エンコードされる値と等号(=)(ASCII 文字 61)で分離します。

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

  2. 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. 作成したばかりのクエリ文字列を、RFC2104準拠のHMACで計算します。計算にあたっては、お客様の秘密キーをキーとして使用し、ハッシュアルゴリズムとしてSHA256を使用します。

    詳細については、 http://tools.ietf.org/html/rfc2104 または http://www.ipa.go.jp/security/rfc/RFC2104JA.html をご参照ください。

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

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

[重要]重要

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