四苦八苦してやっと動いたものなので、責任は持てませんが、自分用メモおよび、もしかしたらご参考になるかもと思い掲載。
やること
Googleサービスアカウントの秘密鍵を使用して1時間の有効期限を持つJWT(JSON Web Token)を生成します。
Googleサービスアカウントの秘密鍵作成
-
Google Cloud Platform Console のナビゲーション メニュー で、
APIs & Services > Credentials に移動 -
目的のプロジェクトを選択し、[Create Credentials > Service account] をクリック。
-
Service account details で、新しいアカウントの名前を入力して [Create] をクリック。
-
Service account permissions ページで、Select a role プルダウンに移動。
-
[Service Accounts > Service Account Token Creator] を選択して、[Continue] をクリック。
-
[Grant users access to this service account] ページで [Done] をクリック。
-
APIs & Services > Credentials に戻り、
Service Accounts セクションまで下にスクロールして、作成したアカウントの名前をクリック。 -
Service account details ページで、Keys セクションまでスクロールして Add Key > Create new key を選択。
-
鍵のタイプとして JSON を選択し、[Create] をクリック。
これで、秘密鍵を含む JSON ファイルがPCにダウンロードされる。
準備
必要なライブラリのインストール
$ pip install pyjwt
$ pip install cryptography
コード
# coding: utf-8
import jwt
import time
import json
from datetime import datetime, timedelta
# サービスアカウントの秘密鍵とそのメールアドレスを含むJSONファイルから情報を読み込む
with open('秘密鍵JSONファイルのパス', 'r') as f:
service_account_info = json.load(f)
# 以下 'private_key'と'client_email'は秘密鍵のJSONファイルにある。長ったらしいキーやemailを記入するのではなく、これを変えずにそのまま'private_key'と'client_email'でいい、
private_key = service_account_info['private_key']
client_email = service_account_info['client_email']
current_time = datetime.now()
# 1時間期限を設定
expiration_time = current_time + timedelta(hours=1)
# JWTのペイロードの作成
payload = {
'iss': client_email,
'sub': client_email,
'iat': int(current_time.timestamp()),
'exp': int(expiration_time.timestamp()),
# 必要に応じて、その他のペイロード情報を追加
}
# JWTの生成
token = jwt.encode(payload, private_key, algorithm='RS256').decode('utf-8')
print(token)
実行結果
$ python createJWT.py
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJwbGF0ZWF5YXItYXBwQHBsYXRlYXUtYXIuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJzdWIiOiJwbGF0ZWF5YXItYXBwQHBsYXRlYXUtYXIuaWFtLmdzZXJ2aWNlYWNjb3VudC5jb20iLCJpYXQiOjE2OTMwOTM0ODMsImV4cCI6MTY5MzA5NzA4M30.YMWwCbCenFZW638CTOs2V0zmywovMOutYViijaX3rXDd7ENYV_lLYxzwasAURE31uBzkaRGk3_qeqgYiHbhOlmEdD3Mttq_cB7rD0HS1yjm4D7unZcemVUxDg7I18LjX-PIQ1FyiyqlAN42wgoYezTUOG4vIbprxt1IpGc0qA27TTD95yOW8JtzUIBQQW6WvRoMmi1Kuw_TNC5gUPzSeNnfl8pRo_xvnmJsmzNjaOhqL3Ba5PQe0Kr4sFwWAWVQOfjb7yWXthfpNeRzE4H_ICfS2ExLbzCvwo8Qmc47uiXH01ujIqRFlyVrnkG5qVs0NXmdTBZdybH9P8Cp2Nu_KDA
JWTが生成されました。
以上です。