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('認証に失敗しました。')