jwt --- JSON Web Token

MicroPython 向けの JSON Web Token(JWT)標準の小規模な実装です。JWT は、発行者が署名する JSON ペイロードのためのコンパクトで URL セーフなコンテナであり、検証者が改ざんや有効期限切れを検出できるようにします。

この MicroPython 移植版は意図的に小規模になっています:

  • HS256(SHA-256 を用いた HMAC)のみがサポートされます。RSA / ECDSA / EdDSA アルゴリズムは実装されていません。発行者と検証者は対称な秘密鍵を共有する必要があります。

  • オプションの exp(有効期限)クレームは尊重されます。その他の登録済みクレーム(nbfiatissaudsubjti)はペイロード内でそのまま渡されますが、検証はされません。必要であればアプリケーションがそれらをチェックします。

  • 鍵のローテーション、JWKS、オーディエンスリストの処理はありません。

関数

jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str

payload を署名付き JWT にエンコードし、結果として得られるコンパクトなシリアライズ("header.payload.signature" の形式の str で、各セグメントは Base64-URL エンコードされる)を返します。

payload

クレームを格納した JSON シリアライズ可能な dict です。標準クレーム(expiatsub など)はそのまま渡されます。カスタムのアプリケーションキーも許可されます。

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 -- HS256algorithms に含まれていないか、トークンのヘッダーの algHS256 以外である場合。

  • 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"])

署名と検証に同じシークレットが使用されるため、検証者は発行者が使用した鍵を保持していなければなりません。カメラが発行者となるサービス(ペアリングされた電話機にトークンを渡す)の場合は、シークレットをカメラのファイルシステム上に保管し、他の長期的な資格情報と同様に扱ってください。運用:鍵、有効期限、トラブルシューティング を参照してください。

注釈

このモジュールは hmachashlib に依存しており、どちらもカメラに組み込まれています。外部の設定は不要です。鍵は任意の長さで構いませんが、HMAC の構成は少なくとも SHA-256 のブロックサイズ(32 バイト)以上の長さの鍵で最も有用です。