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 birstr).- 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ı.
bytestercih edilir;strotomatik olarak UTF-8 ile kodlanır.- algorithm
"HS256"olmalıdır (varsayılan). Başka herhangi bir değerexceptions.InvalidAlgorithmErrorfırlatır.
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict¶
token nesnesinin imzasını ve (varsa)
exptalebini doğrular ve kod çözülmüş yük sözlüğünü döndürür. Herhangi bir başarısızlık durumundaexceptions.PyJWTErrorsı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.
HS256mevcut olmalı ve token’ın başlığındakialgbu listede bulunmalıdır. Varsayılan değer["HS256"]şeklindedir.
Fırlatır:
exceptions.InvalidAlgorithmError–HS256, algorithms listesinde değildir veya token’ın başlığındakialg,HS256dışında herhangi bir değerdir.exceptions.InvalidTokenError– token bozuk biçimlidir (üç Base64-URL parçasına bölünmez veya bir parçanın kodu çözülemez / JSON olarak ayrıştırılamaz).exceptions.InvalidSignatureError– imza, başlık ve yük üzerinden yeniden hesaplanan HMAC ile eşleşmez.exceptions.ExpiredSignatureError– yük, değeri geçerli Unix zamanından küçük olan birexptalebi içerir. Bu denetimin anlamlı olabilmesi için kameranın saatinin ayarlanmış olması gerekir; bkz.ntptime.settime().
İ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.PyJWTErrorsı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
HS256dışında bir algoritma istemiştir.exceptions.PyJWTErrorsı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.PyJWTErrorsınıfının bir alt sınıfı.
- exception exceptions.ExpiredSignatureError¶
Token’ın
exptalebi geçmiştedir.exceptions.PyJWTErrorsı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.