OAuth署名生成 python実装サンプル

OAuth署名生成 python実装サンプル

OAuth署名生成のpythonによる実装サンプルを以下に示します。

# -*- coding: utf-8 -*-
#
### OAuth HMAC-SHA1方式の署名を作成する.
# make_signature_hmac(http_method, parameter, uri, secret)
# @param string http_method    HTTPメソッドを指定
# @param dict   parameter      クエリパラメータとOAuthパラメータをマージしたもの
# @param string uri            実際にリクエストするURI(リクエストパラメータは含めない)
# @param string secret         秘密鍵
#
### oauthパラメータ一覧
# oauth_consumer_key	       ZDCから発行されたクライアントIDを設定します
# oauth_signature_method”      HMAC-SHA1” 固定
# oauth_signature              リクエストURIより生成したOAuth署名
# oauth_timestamp              現在時刻のUNIXタイムスタンプを設定してください
# oauth_nonce                  リクエスト毎に一意なランダム値を設定してください
# oauth_version                ”1.0” 固定

import time
import urlparse
import urllib
import hmac
import hashlib

# 動作確認用
http_method = 'get'
parameter = {
    'if_clientid'           :キー,
    'if_auth_type'          :'oauth',
    'word'                  :任意の検索語句
    'oauth_consumer_key'    :キー,
    'oauth_signature_method':'HMAC-SHA1',
    'oauth_timestamp'       :int(time.time()),
    'oauth_nonce'           :任意の文字列,
    'oauth_version'         :'1.0',
    'oauth_signature'       :''
}
uri = 'http://core.its-mo.com/zmaps/api/apicore/core/v1_0/address/word'
secret = ''                  # キーに紐づく秘密鍵

def make_signature_hmac(http_method, parameter, uri, secret):
    # http_method
    http_method = http_method.upper()
    # print('\n' + '***http_method***' + '\n' +http_method)

    # params
    if 'oauth_signature' in parameter:
        del parameter['oauth_signature']
    params = urllib.urlencode(sorted(parameter.items(),key=lambda x:x[0]))
    # print('\n' + '***params***' + '\n' +params)

    # uri
    parts = urlparse.urlparse(uri)
    scheme = parts.scheme if parts.scheme else 'http'
    port = '443' if scheme == 'https' else '80'
    host = parts.netloc
    path = parts.path
    uri = scheme + '://' + host + path
    # print('\n' + '***uri***' + '\n' +uri)

    # secret
    secret += '&'
    # print('\n' + '***secretKey***' + '\n' + secret)

    # base_string
    base_string = http_method + '&' + urllib.quote(uri,'') + '&' + urllib.quote(params,'')
    # print('\n' + '***basestring***' + '\n' + base_string)

    # oauth_signature
    signature = (hmac.new(secret,base_string,hashlib.sha1).digest()).encode('base64')
    parameter['oauth_signature'] = signature.strip()
    # print('\n' + '***oauth_signature***' + '\n' + parameter['oauth_signature'])

# 動作確認

make_signature_hmac(http_method, parameter, uri, secret)

url = uri + '?' + urllib.urlencode(parameter)
print('\n' + '***URL***' + '\n' + url)

result = None
try :
    result = urllib.urlopen( url ).read()
    print '\n' + result
except ValueError :
    print "アクセスに失敗しました。"
except IOError :
    print "認証に失敗しました。"