OAuth署名生成 python3実装サンプル
OAuth署名生成 python3実装サンプル
OAuth署名生成のpython3による実装サンプルを以下に示します。
# -*- 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 urllib.parse import urllib import urllib.request import hmac import hashlib import base64 # 動作確認用 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' #使用するAPI 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.parse.urlencode(sorted(parameter.items(),key=lambda x:x[0])) # print('\n' + '***params***' + '\n' +params) # uri parts = urllib.parse.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.parse.quote(uri,'') + '&' + urllib.parse.quote(params,'') # print('\n' + '***basestring***' + '\n' + base_string) # oauth_signature # signatureはバイト型になる signature = (hmac.new(secret.encode(), base_string.encode(), hashlib.sha1).digest()) # base64エンコードを行う signature1 = base64.b64encode(signature) parameter['oauth_signature'] = signature1.decode() print('\n' + '***oauth_signature***' + '\n' + parameter['oauth_signature']) # 動作確認 make_signature_hmac(http_method, parameter, uri, secret) url = uri + '?' + urllib.parse.urlencode(parameter) print('\n' + '***URL***' + '\n' + url) result = None try : result = urllib.request.urlopen( url ).read() print('\n' + result.decode()) except ValueError : print('アクセスに失敗しました。') except IOError : print('認証に失敗しました。')