jwt — JSON Web Tokens¶
Een kleine implementatie van de JSON Web Token (JWT)-standaard voor MicroPython. JWT is een compacte, URL-veilige container voor een JSON-payload die de uitgever ondertekent, zodat de verifieerder manipulatie en verloop kan detecteren.
Deze MicroPython-port is bewust klein gehouden:
Alleen HS256 (HMAC met SHA-256) wordt ondersteund. RSA-, ECDSA- en EdDSA-algoritmen zijn niet geïmplementeerd; de uitgever en de verifieerder moeten een symmetrische geheime sleutel delen.
De optionele
exp-claim (verloop) wordt gehonoreerd. Andere geregistreerde claims (nbf,iat,iss,aud,sub,jti) worden ongewijzigd in de payload doorgegeven, maar niet gevalideerd; de applicatie controleert ze als ze er belang aan hecht.Geen sleutelrotatie, JWKS of afhandeling van audience-lijsten.
Functies¶
- jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str¶
Codeer payload naar een ondertekend JWT en geef de resulterende compacte serialisatie terug (een
strvan de vorm"header.payload.signature", waarbij elk segment Base64-URL-gecodeerd is).- payload
Een JSON-serialiseerbare dict met claims. Standaardclaims (
exp,iat,sub, …) worden ongewijzigd doorgegeven; aangepaste applicatiesleutels zijn toegestaan.- key
Het gedeelde HMAC-geheim.
bytesheeft de voorkeur;strwordt automatisch als UTF-8 gecodeerd.- algorithm
Moet
"HS256"zijn (de standaardwaarde). Al het andere werptexceptions.InvalidAlgorithmError.
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict¶
Verifieer de handtekening van token en (indien aanwezig) de
exp-claim, en geef de gedecodeerde payload-dict terug. Werpt bij elke fout een subklasse vanexceptions.PyJWTError– de aanroeper vangt doorgaans de basisklasse op.- token
De compacte JWT-string die door
encode()(of een willekeurige compatibele uitgever) is geproduceerd.- key
Het gedeelde HMAC-geheim. Moet overeenkomen met de sleutel die bij het coderen is gebruikt.
- algorithms
De lijst met algoritmen die de aanroeper bereid is te accepteren.
HS256moet aanwezig zijn, en dealgin de header van het token moet in de lijst voorkomen. Standaardwaarde is["HS256"].
Werpt:
exceptions.InvalidAlgorithmError–HS256staat niet in algorithms, of dealgin de header van het token is iets anders danHS256.exceptions.InvalidTokenError– het token is misvormd (splitst niet in drie Base64-URL-segmenten, of een segment kan niet worden gedecodeerd / als JSON worden geparseerd).exceptions.InvalidSignatureError– de handtekening komt niet overeen met de opnieuw berekende HMAC over de header en payload.exceptions.ExpiredSignatureError– de payload bevat eenexp-claim waarvan de waarde lager is dan de huidige Unix-tijd. De klok van de camera moet zijn ingesteld om deze controle zinvol te maken; zientptime.settime().
Uitzonderingen¶
Alle uitzonderingen zijn genest onder het moduleattribuut jwt.exceptions.
- exception exceptions.PyJWTError¶
Basisklasse voor elke JWT-fout. Vang deze op als u geen onderscheid hoeft te maken tussen de onderstaande gevallen.
- exception exceptions.InvalidTokenError¶
Het token is structureel ongeldig – verkeerd aantal segmenten, een segment dat de Base64-decodering niet doorstaat, of JSON die niet kan worden geparseerd. Subklasse van
exceptions.PyJWTError.
- exception exceptions.InvalidAlgorithmError¶
Het algoritme van het token staat niet in de door de aanroeper geaccepteerde lijst, of de aanroeper vroeg om een ander algoritme dan
HS256. Subklasse vanexceptions.PyJWTError.
- exception exceptions.InvalidSignatureError¶
De handtekening van het token komt niet overeen met de HMAC die met de opgegeven sleutel uit de header en payload is berekend. Subklasse van
exceptions.PyJWTError.
- exception exceptions.ExpiredSignatureError¶
De
exp-claim van het token ligt in het verleden. Subklasse vanexceptions.PyJWTError. De wandklok-tijd van de camera moet zijn ingesteld (viantptime.settime()) om deze controle zinvol te maken.
Voorbeeld¶
Een uitgifte-/verificatiecyclus met een symmetrisch geheim:
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"])
Hetzelfde geheim wordt gebruikt om te ondertekenen en te verifiëren, dus de verifieerder moet de sleutel bezitten die de uitgever heeft gebruikt. Voor services waarbij de camera de uitgever is (die tokens uitdeelt aan een gekoppelde telefoon), houdt u het geheim op het camerabestandssysteem en behandelt u het als elke andere langlevende referentie – zie Operaties: sleutels, verloop en probleemoplossing.