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 str berbentuk "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. bytes lebih diutamakan; str dikodekan secara otomatis ke UTF-8.

algorithm

Harus berupa "HS256" (nilai default). Nilai lain akan memunculkan exceptions.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 subkelas exceptions.PyJWTError pada 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. HS256 harus ada, dan alg header token harus ada dalam daftar. Default-nya adalah ["HS256"].

Memunculkan:

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 dari exceptions.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 exp token sudah lampau. Subkelas dari exceptions.PyJWTError. Waktu jam kamera harus disetel (melalui ntptime.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.

Catatan

Modul ini bergantung pada hmac dan hashlib, keduanya sudah built-in ke dalam kamera. Tidak diperlukan konfigurasi eksternal. Kunci boleh memiliki panjang berapa pun, tetapi konstruksi HMAC paling berguna dengan kunci yang setidaknya sepanjang ukuran blok SHA-256 (32 byte).