jwt — JSON Web Tokens¶
Невелика реалізація стандарту JSON Web Token (JWT) для MicroPython. JWT — це компактний, URL-безпечний контейнер для JSON-навантаження, який видавець підписує, щоб верифікатор міг виявити підробку та закінчення терміну дії.
Цей порт MicroPython навмисно мінімальний:
Підтримується лише HS256 (HMAC з SHA-256). Алгоритми RSA / ECDSA / EdDSA не реалізовані; видавець та верифікатор мають спільний симетричний секретний ключ.
Необов’язкова заявка
exp(закінчення терміну дії) враховується. Інші зареєстровані заявки (nbf,iat,iss,aud,sub,jti) передаються без змін у навантаженні, але не перевіряються; застосунок перевіряє їх за потреби.Без обробки ротації ключів, JWKS або списку аудиторій.
Функції¶
- jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str¶
Кодувати payload у підписаний JWT та повернути отриману компактну серіалізацію (рядок
strформи"header.payload.signature", кожен сегмент закодований у Base64-URL).- payload
Словник заявок, серіалізовуваний у JSON. Стандартні заявки (
exp,iat,sub, …) передаються дослівно; дозволені власні ключі застосунку.- key
Спільний секрет HMAC. Переважно
bytes;strавтоматично кодується у UTF-8.- algorithm
Має бути
"HS256"(за замовчуванням). Будь-яке інше значення викидаєexceptions.InvalidAlgorithmError.
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict¶
Перевірити підпис token та (за наявності) його заявку
exp, і повернути декодований словник навантаження. При будь-якій невдачі викидається підкласexceptions.PyJWTError— зазвичай викликач перехоплює базовий клас.- token
Компактний рядок JWT, створений
encode()(або будь-яким сумісним видавцем).- key
Спільний секрет HMAC. Має збігатися з ключем, використаним під час кодування.
- algorithms
Список алгоритмів, які викликач готовий прийняти.
HS256має бути присутнім, а заголовок токенаalgмає бути у списку. За замовчуванням["HS256"].
Викидає:
exceptions.InvalidAlgorithmError—HS256відсутній у algorithms, або заголовок токенаalgє чимось іншим, ніжHS256.exceptions.InvalidTokenError— токен має неправильну структуру (не розбивається на три сегменти Base64-URL, або сегмент не вдається декодувати / розібрати як JSON).exceptions.InvalidSignatureError— підпис не відповідає перерахованому HMAC по заголовку та навантаженню.exceptions.ExpiredSignatureError— навантаження містить заявкуexp, значення якої менше поточного часу Unix. Годинник камери має бути встановлений для того, щоб ця перевірка мала сенс; дивітьсяntptime.settime().
Винятки¶
Усі винятки вкладені під атрибут модуля jwt.exceptions.
- exception exceptions.PyJWTError¶
Базовий клас для будь-якого збою JWT. Перехоплюйте його, якщо не потрібно розрізняти наведені нижче випадки.
- exception exceptions.InvalidTokenError¶
Токен структурно недійсний — неправильна кількість сегментів, сегмент, що не вдається декодувати з Base64, або JSON, що не вдається розібрати. Підклас
exceptions.PyJWTError.
- exception exceptions.InvalidAlgorithmError¶
Алгоритм токена відсутній у прийнятному списку викликача, або викликач запитав алгоритм, відмінний від
HS256. Підкласexceptions.PyJWTError.
- exception exceptions.InvalidSignatureError¶
Підпис токена не відповідає HMAC, обчисленому з заголовка та навантаження за допомогою наданого ключа. Підклас
exceptions.PyJWTError.
- exception exceptions.ExpiredSignatureError¶
Заявка
expтокена знаходиться у минулому. Підкласexceptions.PyJWTError. Системний час камери має бути встановлений (черезntptime.settime()), щоб ця перевірка мала сенс.
Приклад¶
Цикл видачі/перевірки з симетричним секретом:
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"])
Той самий секрет використовується для підписання та перевірки, тому верифікатор повинен мати ключ, який використовував видавець. Для сервісів, де камера є видавцем (роздає токени парному телефону), зберігайте секрет у файловій системі камери та поводьтеся з ним, як з будь-якими іншими довгостроковими обліковими даними — дивіться Операції: ключі, термін дії та усунення несправностей.