jwt --- JSON Web Token

JSON Web Token(JWT)標準在 MicroPython 上的精簡實作。JWT 是一種精簡且 URL 安全的容器,用於存放發行者所簽署的 JSON 酬載,讓驗證者能夠偵測竄改與過期。

此 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 的聲明字典。標準聲明(expiatsub、...)會原封不動地傳遞;亦允許自訂的應用程式鍵。

key

共用的 HMAC 秘密金鑰。建議使用 bytesstr 會自動以 UTF-8 編碼。

algorithm

必須是 "HS256"(預設值)。其他任何值都會擲出 exceptions.InvalidAlgorithmError

jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict

驗證 token 的簽章以及(若存在)其 exp 聲明,並回傳解碼後的酬載字典。任何失敗時都會擲出 exceptions.PyJWTError 的子類別——呼叫者通常會捕捉基底類別。

token

encode()(或任何相容的發行者)所產生的精簡 JWT 字串。

key

共用的 HMAC 秘密金鑰。必須與編碼時所用的金鑰相符。

algorithms

呼叫者願意接受的演算法清單。HS256 必須存在,且 token 標頭中的 alg 必須在此清單中。預設為 ["HS256"]

擲出例外:

例外

所有例外皆巢狀於模組屬性 jwt.exceptions 之下。

exception exceptions.PyJWTError

每個 JWT 失敗的基底類別。若你不需要區分下列各種情況,可捕捉此類別。

exception exceptions.InvalidTokenError

token 在結構上無效——區段數量錯誤、某個區段無法通過 Base64 解碼,或 JSON 無法剖析。為 exceptions.PyJWTError 的子類別。

exception exceptions.InvalidAlgorithmError

token 的演算法不在呼叫者接受的清單中,或呼叫者要求了 HS256 以外的演算法。為 exceptions.PyJWTError 的子類別。

exception exceptions.InvalidSignatureError

token 的簽章與使用所提供金鑰、根據標頭及酬載所計算出的 HMAC 不相符。為 exceptions.PyJWTError 的子類別。

exception exceptions.ExpiredSignatureError

token 的 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"])

簽署與驗證使用相同的秘密金鑰,因此驗證者必須持有發行者所使用的金鑰。對於以相機作為發行者(向配對的手機發放 token)的服務,請將秘密金鑰保存在相機檔案系統上,並像對待任何其他長期憑證一樣對待它——請參閱 運維作業:金鑰、到期與疑難排解

備註

本模組依賴 hmachashlib,兩者皆內建於相機中。不需要任何外部設定。金鑰可為任意長度,但 HMAC 結構在金鑰長度至少達到 SHA-256 區塊大小(32 個位元組)時最為有效。