jwt --- JSON Web Token¶
MicroPython 向けの JSON Web Token(JWT)標準の小規模な実装です。JWT は、発行者が署名する JSON ペイロードのためのコンパクトで URL セーフなコンテナであり、検証者が改ざんや有効期限切れを検出できるようにします。
この MicroPython 移植版は意図的に小規模になっています:
HS256(SHA-256 を用いた HMAC)のみがサポートされます。RSA / ECDSA / EdDSA アルゴリズムは実装されていません。発行者と検証者は対称な秘密鍵を共有する必要があります。
オプションの
exp(有効期限)クレームは尊重されます。その他の登録済みクレーム(nbf、iat、iss、aud、sub、jti)はペイロード内でそのまま渡されますが、検証はされません。必要であればアプリケーションがそれらをチェックします。鍵のローテーション、JWKS、オーディエンスリストの処理はありません。
関数¶
- jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str¶
payload を署名付き JWT にエンコードし、結果として得られるコンパクトなシリアライズ(
"header.payload.signature"の形式のstrで、各セグメントは Base64-URL エンコードされる)を返します。- payload
クレームを格納した JSON シリアライズ可能な dict です。標準クレーム(
exp、iat、subなど)はそのまま渡されます。カスタムのアプリケーションキーも許可されます。- key
共有の HMAC シークレットです。
bytesが推奨されます。strは自動的に UTF-8 でエンコードされます。- algorithm
"HS256"(デフォルト)でなければなりません。それ以外の場合はexceptions.InvalidAlgorithmErrorが送出されます。
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict¶
token の署名と(存在する場合は)その
expクレームを検証し、デコードされたペイロード dict を返します。いずれかの失敗時にはexceptions.PyJWTErrorのサブクラスを送出します。呼び出し側は通常、基底クラスをキャッチします。- token
encode()(または互換性のある任意の発行者)によって生成されたコンパクトな JWT 文字列です。- key
共有の HMAC シークレットです。エンコード時に使用した鍵と一致しなければなりません。
- algorithms
呼び出し側が受け入れてもよいアルゴリズムのリストです。
HS256が含まれていなければならず、トークンのヘッダーのalgがリスト内になければなりません。デフォルトは["HS256"]です。
送出される例外:
exceptions.InvalidAlgorithmError--HS256が algorithms に含まれていないか、トークンのヘッダーのalgがHS256以外である場合。exceptions.InvalidTokenError-- トークンが不正な形式である場合(3 つの Base64-URL セグメントに分割されない、またはセグメントのデコードや JSON としての解析に失敗する)。exceptions.InvalidSignatureError-- 署名が、ヘッダーとペイロードに対して再計算された HMAC と一致しない場合。exceptions.ExpiredSignatureError-- ペイロードに、その値が現在の Unix 時刻より小さいexpクレームが含まれている場合。このチェックが意味を持つには、カメラの時計が設定されている必要があります。ntptime.settime()を参照してください。
例外¶
すべての例外はモジュール属性 jwt.exceptions の下にネストされています。
- exception exceptions.PyJWTError¶
すべての JWT 失敗の基底クラスです。以下のケースを区別する必要がない場合は、これをキャッチしてください。
- exception exceptions.InvalidTokenError¶
トークンが構造的に無効である場合です。セグメント数が誤っている、セグメントの Base64 デコードに失敗する、または JSON の解析に失敗する場合です。
exceptions.PyJWTErrorのサブクラスです。
- exception exceptions.InvalidAlgorithmError¶
トークンのアルゴリズムが呼び出し側の受け入れリストに含まれていないか、呼び出し側が
HS256以外のアルゴリズムを要求した場合です。exceptions.PyJWTErrorのサブクラスです。
- exception exceptions.InvalidSignatureError¶
トークンの署名が、指定された鍵を用いてヘッダーとペイロードから計算された HMAC と一致しない場合です。
exceptions.PyJWTErrorのサブクラスです。
- exception exceptions.ExpiredSignatureError¶
トークンの
expクレームが過去のものである場合です。exceptions.PyJWTErrorのサブクラスです。このチェックが意味を持つには、カメラの実時間(ntptime.settime()を介して)が設定されている必要があります。
例¶
対称シークレットによる発行/検証のサイクル:
import jwt
import time
SECRET = b"keep-this-out-of-source-control"
payload = {
"sub": "kitchen-cam",
"role": "admin",
"exp": time.time() + 3600, # 1 hour from now
}
token = jwt.encode(payload, SECRET)
print("token:", token)
try:
claims = jwt.decode(token, SECRET)
except jwt.exceptions.PyJWTError as e:
print("rejected:", type(e).__name__)
else:
print("subject:", claims["sub"])
署名と検証に同じシークレットが使用されるため、検証者は発行者が使用した鍵を保持していなければなりません。カメラが発行者となるサービス(ペアリングされた電話機にトークンを渡す)の場合は、シークレットをカメラのファイルシステム上に保管し、他の長期的な資格情報と同様に扱ってください。運用:鍵、有効期限、トラブルシューティング を参照してください。