PythonでYahoo!ショッピングAPIの公開鍵認証を実装する。

yahoo api

背景

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の場合では不要)

  • 注文検索API
  • 注文詳細API
  • 注文内容変更API
  • メッセージ投稿API
  • 質問詳細API
  • 質問一覧API

  • 2023年7月下旬までの対応ですので、もう間もなく移行期限を迎えます。
    お役にたちましたら幸いです。

    カテゴリ:技術記事
    Profile picture

    Yasutou Hoshino Twitter:@yasutouhoshino