最終更新日:2025-08-18 15:49:30
認証付きリクエストの場合、SDKを使用しない限り、リクエストに認証情報を提供するための署名を計算するコードを書く必要があります。署名の計算は複雑になりがちなので、可能な限りSDKsの利用を推奨します。
本セクションでは、署名の計算方法を説明するため、リクエストの例を用いて手順を示します。たとえば、API「GetBucket」を呼び出し、バケット「test-authentication」にあるファイルのうち、プレフィックスが"OS"のものを一覧取得したい場合、リクエストは次のようになります。
リクエスト例
GET /?prefix=OS HTTP/1.1
Host: test-authentication.s3-cn-north-1.wcsapi.com
x-wos-date:20201103T104419Z
Authorization: <Authorization>
import sys, os, base64, datetime, hashlib, hmac
import requests
# ************* リクエスト値の設定 *************
# 以下のコードは、ヘッダーに認証情報を含める方法を示しています。
# ここではAPI「GetBucket」を例にします。
# GET /?prefix=OS
# Host: test-authentication.s3-cn-north-1.wcsapi.com
service = 'wos'
host = 'test-authentication.s3-cn-north-1.wcsapi.com'
region = 'cn-north-1'
endpoint = 'http://test-authentication.s3-cn-north-1.wcsapi.com'
request_parameters = 'prefix=OS'
# キー導出関数
def sign(key, msg):
return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()
# SigningKey導出関数
def getSignatureKey(key, dateStamp, regionName, serviceName):
kDate = sign(('WOS' + key).encode('utf-8'), dateStamp)
kRegion = sign(kDate, regionName)
kService = sign(kRegion, serviceName)
kSigning = sign(kService, 'wos_request')
return kSigning
# アクセスキーおよびシークレットキー。環境変数や設定ファイルからも取得可能です。
access_key = 'LqswcPGFYA06V0fQ2HtgVRR3Wi5fzpR******'
secret_key = 'B2UZV6uwULVnosYQxORTYSdbTTAJVptWvDoV0fLENgA3ERPc8UxYfvTigS******'
if access_key is None or secret_key is None:
print('アクセスキーが設定されていません。')
sys.exit()
# ヘッダー用およびクレデンシャルスコープ用の日付を作成
t = datetime.datetime.utcnow()
wosdate = t.strftime('%Y%m%dT%H%M%SZ')
print('wosdate: ' + wosdate)
datestamp = t.strftime('%Y%m%d') # 日付のみ(時刻なし)、クレデンシャルスコープに使用
# ************* タスク1: 正規リクエストを作成 *************
# ステップ1: HTTPメソッドの定義(GET, POSTなど)
method = 'GET'
# ステップ2: 正規URIの作成 — ドメインからクエリまでのURI部分
# GetBucketリクエストはパスを必要としないため「/」を使用
canonical_uri = '/'
# ステップ3: 正規クエリストリングの作成。本例はGETリクエストのため、
# パラメータはクエリストリングに含まれます。値はURLエンコードし、パラメータ名でソートします。
# 今回はパラメータ「prefix=OS」がファイルの接頭辞指定です。
canonical_querystring = request_parameters
# ステップ4: 正規ヘッダーと署名対象ヘッダーの作成。ヘッダー名は小文字にし、
# コードポイント順(昇順)で並べてください。末尾に「\n」が必要です。
canonical_headers = 'host:' + host + '\n' + 'x-wos-date:' + wosdate + '\n'
# ステップ5: 署名対象ヘッダーのリストを作成。正規ヘッダーリスト内のヘッダー名を
# セミコロン(;)区切りかつアルファベット順で記述します。
# 注意:「Host」と「x-wos-date」は必須です。
signed_headers = 'host;x-wos-date'
# ステップ6: ペイロードハッシュの作成(リクエストボディの内容のハッシュ)。GETリクエストの場合、ペイロードは空文字列("")です。
payload_hash = hashlib.sha256(('').encode('utf-8')).hexdigest()
# ステップ7: 各要素を組み合わせて正規リクエストを作成
canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + '\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash
# ************* タスク2: 署名用文字列の作成 *************
# アルゴリズムを使用するハッシュ方式に合わせてください。SHA-1もしくは推奨のSHA-256。
algorithm = 'WOS-HMAC-SHA256'
credential_scope = datestamp + '/' + region + '/' + service + '/' + 'wos_request'
string_to_sign = algorithm + '\n' + wosdate + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()
# ************* タスク3: 署名の計算 *************
# 上記の関数で署名用キー(signing key)を作成
signing_key = getSignatureKey(secret_key, datestamp, region, service)
# signing_keyを用いてstring_to_signに署名
signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()
print(signature)
# ************* タスク4: リクエストへの署名情報追加 *************
# Authorizationヘッダーを作成し、リクエストヘッダーに追加
authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + credential_scope + ', ' + 'SignedHeaders=' + signed_headers + ', ' + 'Signature=' + signature
headers = {'x-wos-date':wosdate, 'Authorization':authorization_header}
# ************* リクエスト送信 *************
request_url = endpoint + '?' + canonical_querystring
print('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')
print('Request URL = ' + request_url)
r = requests.get(request_url, headers=headers)
print('\nRESPONSE++++++++++++++++++++++++++++++++++++')
print('Response code: %d\n' % r.status_code)
print(r.text)