Python JWT 検証例
⚠️ 重要なお知らせ: これはデモンストレーション目的の基本的な例です。実運用で使用する場 合は、ソフトウェアスタック、セキュリティ要件、デプロイ環境に特化したベストプラクティスを調査し、実装してください。常に組織のセキュリティガイドラインに従い、確立されたJWTライブラリやフレームワークの使用を検討してください。
📝 注: この例は教育目的でJWKSのダウンロードとファイルキャッシングを示しています。実運用環境では、インフラストラクチャに基づいて、構成管理、環境変数、または好みのキャッシング戦略を使用してJWKSキー管理を実装することを検討してください。
この例は、Pythonを使用してRokt JWTトークンを検証する方法を示しています。
前提条件
必要なパッケージをインストールします:
pip install PyJWT cryptography
完全な例
import jwt
import json
import base64
from cryptography.hazmat.primitives.asymmetric import ec
from cryptography.hazmat.primitives.asymmetric.ec import EllipticCurvePublicNumbers, SECP256R1
from cryptography.hazmat.backends import default_backend
from datetime import datetime
def load_jwk_public_key(jwk):
"""JWKをECDSA公開鍵に変換する"""
# base64urlエンコードされた座標をデコード
x = int.from_bytes(base64.urlsafe_b64decode(jwk['x'] + '=='), 'big')
y = int.from_bytes(base64.urlsafe_b64decode(jwk['y'] + '=='), 'big')
# ECDSA公開鍵を作成
public_numbers = EllipticCurvePublicNumbers(x, y, SECP256R1())
return public_numbers.public_key(default_backend())
def validate_jwt_token(token, jwks_json):
"""JWKSを使用してJWTトークンを検証する"""
try:
# JWKSを解析
jwks = json.loads(jwks_json)
if not jwks.get('keys'):
raise ValueError('JWKSにキーが見つかりません')
# 最初のキーを取得
jwk = jwks['keys'][0]
# JWKを公開鍵に変換
public_key = load_jwk_public_key(jwk)
# JWTトークンを検証およびデコード
claims = jwt.decode(
token,
public_key,
algorithms=['ES256'],
leeway=60 # 1分の時計のずれを許可
)
return {
'is_valid': True,
```python
'claims': claims
}
except Exception as e:
return {
'is_valid': False,
'error': str(e)
}
def main():
# 概要ページからテストトークンをコピー
sample_token = "PASTE_TEST_TOKEN_HERE"
# JWKS エンドポイント URL
jwks_url = "https://public-api.rokt.com/.well-known/jwks.json"
print("=== Python JWT バリデーター ===")
print(f"Token: {sample_token[:50]}...")
print(f"JWKS URL: {jwks_url}")
print()
# JWKS をダウンロードしてキャッシュ
import requests
import json
import os
from datetime import datetime, timedelta
jwks_cache_file = "jwks_cache.json"
# キャッシュファイルが存在し、最近(24時間以内)であるか確認
if os.path.exists(jwks_cache_file):
file_age = datetime.now() - datetime.fromtimestamp(os.path.getmtime(jwks_cache_file))
if file_age < timedelta(hours=24):
print(f"キャッシュされた JWKS を使用: {jwks_cache_file}")
with open(jwks_cache_file, 'r') as f:
jwks_json = f.read()
else:
print("キャッシュが期限切れ、最新の JWKS をダウンロード")
response = requests.get(jwks_url, timeout=10)
response.raise_for_status()
jwks_json = response.text
# JWKS をキャッシュ
with open(jwks_cache_file, 'w') as f:
f.write(jwks_json)
print(f"JWKS をキャッシュしました: {jwks_cache_file}")
else:
print("キャッシュが見つからないため、JWKS をダウンロード")
response = requests.get(jwks_url, timeout=10)
response.raise_for_status()
jwks_json = response.text
# JWKS をキャッシュ
with open(jwks_cache_file, 'w') as f:
f.write(jwks_json)
print(f"JWKS をキャッシュしました: {jwks_cache_file}")
print("JWKS のダウンロードとキャッシュが成功しました")
# JWKS から公開鍵の座標を抽出
jwks_data = json.loads(jwks_json)
if not jwks_data.get('keys') or len(jwks_data['keys']) == 0:
raise Exception("JWKS に鍵が見つかりません")
key = jwks_data['keys'][0]
x_coordinate = key['x']
y_coordinate = key['y']
# トークンを検証
result = validate_jwt_token(sample_token, jwks_json)
if result['is_valid']:
``````python
claims = result['claims']
print("✅ トークンの検証に成功しました!")
print(f"キャンペーンID: {claims.get('cid')}")
print(f"クリエイティブID: {claims.get('crid')}")
print(f"RCLID: {claims.get('rclid')}")
print(f"発行日時: {datetime.fromtimestamp(claims.get('iat')).strftime('%Y-%m-%d %H:%M:%S UTC')}")
else:
print(f"❌ トークンの検証に失敗しました: {result['error']}")
if __name__ == "__main__":
main()
入出力例
入力
- JWTトークン: Overviewページからテストトークンをコピー
- 公開鍵ソース:
https://public-api.rokt.com/.well-known/jwks.json
出力
=== Python JWT Validator ===
Token: eyJhbGciOiJFUzI1NiIsImtpZCI6InJva3Qtc2lnbmluZy1rZXkiLCJ0eXAiOiJKV1QifQ...
JWKS URL: https://public-api.rokt.com/.well-known/jwks.json
Downloading JWKS from: https://public-api.rokt.com/.well-known/jwks.json
JWKS cached to: jwks_cache.json
JWKS downloaded and cached successfully
✅ トークンの検証に成功しました!
キャンペーンID: 3436085368692408324
クリエイティブID: 3437732754935906308
RCLID: 7db958dbd232247a4a8285a34d22fe0f4e9affa463bf5ee54e26721ab0df0e23
発行日時: 2025-08-20 15:10:01 UTC
実行方法
- コードを
rokt_jwt_validator.pyに保存 - 依存関係をインストール:
pip install PyJWT cryptography - 実行:
python rokt_jwt_validator.py
joseを使用した代替実装
より堅牢なソリューションとして、python-jose ライブラリを使用することもできます:
pip install python-jose[cryptography]
from jose import jwt
from jose.jwk import get_public_key
def validate_with_jose(token, jwks_json):
jwks = json.loads(jwks_json)
public_key = get_public_key(jwks['keys'][0])
claims = jwt.decode(
token,
public_key,
algorithms=['ES256']
)
return claims
注意事項
-
公開鍵はRoktのJWKSエンドポイントから取得されます
-
この例では、署名検証にECDSA-256 (ES256) アルゴリズムを使用しています
-
パフォーマンス向上のために公開鍵をキャッシュすることを検討してください
-
cryptographyライブラリは純粋なPython実装よりも優れたセキュリティを提供します