署名認証を含むリクエストの作成方法

2009年8月15日より、Product Advertising API を利用する場合には、リクエストに署名認証を含める必要があります。署名認証を含むリクエストの作成方法です。

  1. リクエストに必要な構成要素を PARAM とします。

    PARAM = {
        "AWSAccessKeyId" : アクセスキーID, 
          Amazon Web Service で取得。
        "Service" : "AWSECommerceService", 
          常に"AWSECommerceService"を入力。 
        "AssociateTag" : アソシエイトID, 
          Amazon アソシエイト・プログラムで取得。
        "SearchIndex" : "Books", 
          検索対象の商品カテゴリ。
        "Operation" : "ItemSearch",
          オペレーション。
        "ResponseGroup" : "Medium", 
          返される値の種類を指定。
        "Version" : "2010-09-01",
          APIのバージョン。
      "Timestamp" : time.strftime(
           "%Y-%m-%dT%H:%M:%SZ", time.localtime())
          タイムスタンプ。
        }
    

  2. PARAM の構成要素に含まれる特殊文字を "%xx" エスケープで置換し、バイト順*1にソートします。

    import urllib
    
    elementList = []
    for key in sorted(PARAM.keys()):
       elementList.append(key + "=" +  urllib.quote(PARAM[key]))
    ※ 改行されている位置がおかしいですが、elementList〜(PARAM[key]))まで一行です。
    
    query = "&".join(elementList)
    "key=value"を"&"で結合。
    

  3. 署名のリクエスト文字列を作成します。

    SIG_MESSAGE = """GET
    ecs.amazonaws.jp
    /onca/xml
    %(query)s"""
    
    message = SIG_MESSAGE % {"query" : query}
    

  4. 秘密キーを使用して、RFC2104準拠のHMAC-SHA256ハッシュアルゴリズムの計算を行います。

    SECRET_ACCESS_KEY = Secret Key(秘密キー) ← Amazon Web Service で取得。
    
    import hmac, hashlib
    dig = hmac.new( SECRET_ACCESS_KEY, msg, hashlib.sha256).digest()
    

  5. Base64エンコードとURLエンコードを実行します。

    import base64
    signature =  urllib.quote(base64.b64encode(dig))
    

  6. リクエストにURLエンコードが完了した署名を追加すれば、署名認証リクエストの完成です。

    AWS_URL = "http://ecs.amazonaws.jp/onca/xml?%(query)s&Signature=%(signature)s"
    
    リクエストURL = AWS_URL % {"query" : query, "signature" : signature}
    



こちらの URL を参考にさせていただきました。

*1:アルファベット順とは異なり、大文字のパラメータは小文字のパラメータの前に並ぶ形式です。