- Auth0が発行するアクセストークンのバリデーション方法についてメモする。
バリデーションの流れ
1. JWT標準検証
※Auth0が発行するアクセストークンはJWT形式となっている
- アクセストークンの有効期限や署名、issuerなどの妥当性を検証する。
- ライブラリを使用して実装することを推奨。
2. Audienceクレームの検証
- トークンに含まれるオーディエンス(
aud
)クレームを検証する。-
aud
値が呼び出し対象API 設定のIdentifier
に設定された値と一致していることを確認する。
-
3. Scope()の検証
- トークンに含まれるスコープ(
scope
)クレームを検証する。-
scope
値に指定された値が呼び出し対象API設定のPermissions
に定義された値と一致していることを確認
-
Pythonコード例
- ライブラリ
PyJWT
を使用
# OpenID ConfigurationエンドポイントからJWKSエンドポイントURLを取得
oidc_config_endpoint = {YOUR_TENANT_URL}/.well-known/openid-configuration
oidc_config = requests.get(
oidc_config_endpoint
).json()
signing_algos = oidc_config["id_token_signing_alg_values_supported"]
jwks_client = jwt.PyJWKClient(oidc_config["jwks_uri"])
# token: 検証対象アクセストークン
# api_identifier: アクセス対象API識別子(API定義に指定したIdentifier値)
# issuer: テナントURL
# api_scope_list: アクセス対象APIスコープ(API定義に指定したPermissions値)
def validate_token(token: str, api_identifier: str, issuer: str, api_scope_list: list):
# JWKSエンドポイントから公開鍵取得
signing_key = jwks_client.get_signing_key_from_jwt(token)
# 1. JWT標準検証
# 2. Audienceクレーム検証
payload = jwt.decode(
token,
key=signing_key.key,
algorithms=signing_algos,
audience=api_identifier,
issuer=issuer
)
# 3. Scopeクレーム検証
# Payloadからスコープを取得
# 複数指定に対応するため' 'で分割
# API定義とPayloadに一致があるかを確認するためsetに変換している
payload_scope_set = set(payload['scope'].split(' '))
api_scope_set = set(api_scope_list)
and_scope_list = list(payload_scope_set & api_scope_set)
# スコープ一致なし
if len(and_scope_list) == 0:
return None
return payload