jwt --- JSON Web Token¶
Implementasi kecil dari standar JSON Web Token (JWT) untuk MicroPython. JWT adalah wadah kompak dan aman untuk URL yang berisi payload JSON yang ditandatangani oleh penerbit agar pemeriksa dapat mendeteksi pemalsuan dan kedaluwarsa.
Port MicroPython ini sengaja dibuat sangat kecil:
Hanya HS256 (HMAC dengan SHA-256) yang didukung. Algoritma RSA / ECDSA / EdDSA tidak diimplementasikan; penerbit dan pemeriksa harus berbagi kunci rahasia simetris.
Klaim opsional
exp(kedaluwarsa) dihormati. Klaim terdaftar lainnya (nbf,iat,iss,aud,sub,jti) diteruskan tanpa perubahan dalam payload tetapi tidak divalidasi; aplikasi memeriksanya sendiri jika diperlukan.Tidak ada penanganan rotasi kunci, JWKS, atau daftar audiens.
Fungsi¶
- jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str¶
Enkode payload menjadi JWT yang ditandatangani dan kembalikan serialisasi kompak yang dihasilkan (sebuah
strberbentuk"header.payload.signature", setiap segmen dikodekan dengan Base64-URL).- payload
Dict klaim yang dapat diserialisasi ke JSON. Klaim standar (
exp,iat,sub, ...) diteruskan verbatim; kunci aplikasi kustom diperbolehkan.- key
Rahasia HMAC bersama.
byteslebih diutamakan;strdikodekan secara otomatis ke UTF-8.- algorithm
Harus berupa
"HS256"(nilai default). Nilai lain akan memunculkanexceptions.InvalidAlgorithmError.
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict¶
Verifikasi tanda tangan token dan (jika ada) klaim
exp-nya, lalu kembalikan dict payload yang didekode. Memunculkan subkelasexceptions.PyJWTErrorpada kegagalan apa pun -- pemanggil biasanya menangkap kelas dasarnya.- token
String JWT kompak yang dihasilkan oleh
encode()(atau penerbit kompatibel apa pun).- key
Rahasia HMAC bersama. Harus cocok dengan kunci yang digunakan saat enkoding.
- algorithms
Daftar algoritma yang bersedia diterima oleh pemanggil.
HS256harus ada, danalgheader token harus ada dalam daftar. Default-nya adalah["HS256"].
Memunculkan:
exceptions.InvalidAlgorithmError--HS256tidak ada dalam algorithms, ataualgheader token bukanHS256.exceptions.InvalidTokenError-- token tidak terbentuk dengan benar (tidak terbagi menjadi tiga segmen Base64-URL, atau segmen gagal didekode / diurai sebagai JSON).exceptions.InvalidSignatureError-- tanda tangan tidak cocok dengan HMAC yang dihitung ulang dari header dan payload.exceptions.ExpiredSignatureError-- payload berisi klaimexpyang nilainya kurang dari waktu Unix saat ini. Jam kamera harus disetel agar pemeriksaan ini bermakna; lihatntptime.settime().
Exception¶
Semua exception berada di bawah atribut modul jwt.exceptions.
- exception exceptions.PyJWTError¶
Kelas dasar untuk setiap kegagalan JWT. Tangkap ini jika Anda tidak perlu membedakan kasus-kasus di bawah ini.
- exception exceptions.InvalidTokenError¶
Token tidak valid secara struktural -- jumlah segmen salah, segmen yang gagal didekode Base64, atau JSON yang gagal diurai. Subkelas dari
exceptions.PyJWTError.
- exception exceptions.InvalidAlgorithmError¶
Algoritma token tidak ada dalam daftar yang diterima pemanggil, atau pemanggil meminta algoritma selain
HS256. Subkelas dariexceptions.PyJWTError.
- exception exceptions.InvalidSignatureError¶
Tanda tangan token tidak cocok dengan HMAC yang dihitung dari header dan payload menggunakan kunci yang diberikan. Subkelas dari
exceptions.PyJWTError.
- exception exceptions.ExpiredSignatureError¶
Klaim
exptoken sudah lampau. Subkelas dariexceptions.PyJWTError. Waktu jam kamera harus disetel (melaluintptime.settime()) agar pemeriksaan ini bermakna.
Contoh¶
Siklus penerbitan/verifikasi dengan rahasia simetris:
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"])
Rahasia yang sama digunakan untuk menandatangani dan memverifikasi, sehingga pemeriksa harus memegang kunci yang digunakan penerbit. Untuk layanan di mana kamera adalah penerbit (membagikan token ke ponsel yang dipasangkan), simpan rahasia di sistem file kamera dan perlakukan seperti kredensial jangka panjang lainnya -- lihat Operasi: kunci, kedaluwarsa, dan pemecahan masalah.