jwt — JSON Web Tokens

JSON Web Token (JWT) standardının MicroPython için küçük bir uygulaması. JWT, vereni tarafından imzalanan bir JSON yükü için kompakt, URL açısından güvenli bir kaptır; böylece doğrulayıcı kurcalamayı ve süre dolmasını tespit edebilir.

Bu MicroPython portu kasıtlı olarak çok küçüktür:

  • Yalnızca HS256 (SHA-256 ile HMAC) desteklenir. RSA / ECDSA / EdDSA algoritmaları uygulanmamıştır; veren ve doğrulayıcı simetrik bir gizli anahtarı paylaşmalıdır.

  • İsteğe bağlı exp (süre dolma) talebi dikkate alınır. Diğer kayıtlı talepler (nbf, iat, iss, aud, sub, jti) yük içinde değiştirilmeden aktarılır ancak doğrulanmaz; uygulama önemsiyorsa onları kendisi denetler.

  • Anahtar döndürme, JWKS veya hedef kitle listesi işleme yoktur.

İşlevler

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

payload nesnesini imzalı bir JWT’ye kodlar ve elde edilen kompakt serileştirmeyi döndürür (her bir parçası Base64-URL kodlu, "header.payload.signature" biçiminde bir str).

payload

JSON olarak serileştirilebilir bir talep sözlüğü. Standart talepler (exp, iat, sub, …) aynen aktarılır; özel uygulama anahtarlarına izin verilir.

key

Paylaşılan HMAC gizli anahtarı. bytes tercih edilir; str otomatik olarak UTF-8 ile kodlanır.

algorithm

"HS256" olmalıdır (varsayılan). Başka herhangi bir değer exceptions.InvalidAlgorithmError fırlatır.

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

token nesnesinin imzasını ve (varsa) exp talebini doğrular ve kod çözülmüş yük sözlüğünü döndürür. Herhangi bir başarısızlık durumunda exceptions.PyJWTError sınıfının bir alt sınıfını fırlatır; çağıran genellikle temel sınıfı yakalar.

token

encode() (veya herhangi bir uyumlu veren) tarafından üretilen kompakt JWT dizesi.

key

Paylaşılan HMAC gizli anahtarı. Kodlama sırasında kullanılan anahtarla eşleşmelidir.

algorithms

Çağıranın kabul etmeye razı olduğu algoritmaların listesi. HS256 mevcut olmalı ve token’ın başlığındaki alg bu listede bulunmalıdır. Varsayılan değer ["HS256"] şeklindedir.

Fırlatır:

İstisnalar

Tüm istisnalar jwt.exceptions modül özniteliği altında iç içe yerleştirilmiştir.

exception exceptions.PyJWTError

Her JWT başarısızlığı için temel sınıf. Aşağıdaki durumlar arasında ayrım yapmanıza gerek yoksa bunu yakalayın.

exception exceptions.InvalidTokenError

Token yapısal olarak geçersizdir – yanlış sayıda parça, Base64 kod çözmesinde başarısız olan bir parça veya ayrıştırılamayan JSON. exceptions.PyJWTError sınıfının bir alt sınıfı.

exception exceptions.InvalidAlgorithmError

Token’ın algoritması çağıran tarafından kabul edilen listede değildir veya çağıran HS256 dışında bir algoritma istemiştir. exceptions.PyJWTError sınıfının bir alt sınıfı.

exception exceptions.InvalidSignatureError

Token’ın imzası, sağlanan anahtar kullanılarak başlık ve yükten hesaplanan HMAC ile eşleşmez. exceptions.PyJWTError sınıfının bir alt sınıfı.

exception exceptions.ExpiredSignatureError

Token’ın exp talebi geçmiştedir. exceptions.PyJWTError sınıfının bir alt sınıfı. Bu denetimin anlamlı olabilmesi için kameranın duvar saati zamanının (ntptime.settime() aracılığıyla) ayarlanmış olması gerekir.

Örnek

Simetrik gizli anahtarlı bir verme/doğrulama döngüsü:

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

İmzalamak ve doğrulamak için aynı gizli anahtar kullanılır, bu nedenle doğrulayıcının, verenin kullandığı anahtarı elinde bulundurması gerekir. Kameranın veren olduğu hizmetlerde (eşleştirilmiş bir telefona token dağıtmak gibi), gizli anahtarı kamera dosya sisteminde tutun ve onu diğer uzun ömürlü kimlik bilgileri gibi ele alın; bkz. İşlemler: anahtarlar, sona erme ve sorun giderme.

Not

Bu modül, her ikisi de kamerada yerleşik olan hmac ve hashlib modüllerine dayanır. Harici bir yapılandırma gerekmez. Anahtarlar herhangi bir uzunlukta olabilir, ancak HMAC yapısı en azından SHA-256 blok boyutu (32 bayt) kadar uzun anahtarlarla en yararlı olanıdır.