背景
Yahoo!ショッピングでは、注文データなどをAPIで取得する際にAPI証明書をリクエストヘッダーに入れる必要がありました。 必須ではありませんが、証明書無しだとリフレッシュトークンを12時間で手動更新しなければならなくなります。 そのため、バッチ処理などを行う上では、実質的に必須のものでした。
そのAPI証明書運用が、現時点では2023年7月下旬に廃止となるアナウンスがされており、後継機能である公開鍵認証に移行する必要があります。
https://developer.yahoo.co.jp/changelog/2022-05-18-shopping293.html
公開鍵認証について
詳細の説明は、以下URLをご参照ください。 https://developer.yahoo.co.jp/webapi/shopping/help.html#aboutapipublickey
しかし、Pythonのサンプルは提供されていないため、ニッチなテーマですが今回の記事で Pythonでの実装方法を紹介したいと思います。
1.公開鍵ファイルを作成する。
公開鍵ファイルをYahoo!ショッピングの管理画面より取得します。 ファイルは、任意の場所に保存してください。
2.認証情報を作成する。
ストアアカウントとunixtimestampを:で結合します。
3.認証情報を公開鍵で暗号化する。
PKCS1PADDINGという方式で暗号化します。
4.BASE64エンコードする。
暗号化したものをBASE64でエンコードします。
実装方法について
まず必要なライブラリは、「time」「base64」「pycryptodome」です。 「time」と「base64」は、Pythonの標準ライブラリなので別途インストールは不要ですが、 「pycryptodome」は以下のコマンドでインストールします。
pip install pycryptodome
ライブラリの準備が出来ましたら、以下の関数を記述します。
import time
from base64 import b64encode
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
def create_public_key_auth():
# 公開鍵を読み込みます。
public_key = open("/path/to/public.pem").read()
recipient_key = RSA.import_key(public_key)
cipher = PKCS1_v1_5.new(recipient_key)
# ストアアカウントとunixtimestampを:で結合します。
message = YAHOO_STOREACCOUNT + ':' + str(int(time.time()))
# 認証情報を公開鍵で暗号化します。
enc_cipher = cipher.encrypt(bytes(message, 'utf-8'))
return b64encode(enc_cipher).decode('utf-8')
これを以下のように呼び出して、注文データ等をAPIリクエストします。
import requests
## 公開鍵認証方式による認証情報の作成
signature = create_public_key_auth()
Headers = {
'Authorization' : 'Bearer アクセストークン',
'Content-Type' : 'text/plain',
'X-sws-signature' : signature,
'X-sws-signature-version' : '1'
}
xmlfile = '省略'
requests.post(
headers=Headers,
url='リクエストURL',
data=xmlfile
)
尚、この公開鍵認証は以下のAPIをリクエストする時のみ必要となります。(例えば発送報告など、これ以外のAPIの場合では不要)
2023年7月下旬までの対応ですので、もう間もなく移行期限を迎えます。
お役にたちましたら幸いです。