jwt — JSON Web Tokens#
Una pequeña implementación del estándar JSON Web Token (JWT) para MicroPython. JWT es un contenedor compacto y seguro para URL de una carga JSON que el emisor firma para que el verificador pueda detectar manipulaciones y caducidad.
Este port de MicroPython es intencionadamente diminuto:
Solo se admite HS256 (HMAC con SHA-256). Los algoritmos RSA / ECDSA / EdDSA no están implementados; el emisor y el verificador deben compartir una clave secreta simétrica.
La declaración opcional
exp(caducidad) se respeta. Otras declaraciones registradas (nbf,iat,iss,aud,sub,jti) se transmiten sin cambios en la carga, pero no se validan; la aplicación las comprueba si le interesan.Sin rotación de claves, JWKS ni gestión de listas de audiencia.
Funciones#
- jwt.encode(payload: dict, key: bytes | str, algorithm: str = 'HS256') str#
Codifica payload en un JWT firmado y devuelve la serialización compacta resultante (un
strcon la forma"header.payload.signature", con cada segmento codificado en Base64-URL).- payload
Un diccionario de declaraciones serializable a JSON. Las declaraciones estándar (
exp,iat,sub, …) se transmiten literalmente; se permiten claves personalizadas de la aplicación.- key
El secreto HMAC compartido. Se prefiere
bytes;strse codifica automáticamente en UTF-8.- algorithm
Debe ser
"HS256"(el valor predeterminado). Cualquier otro valor generaexceptions.InvalidAlgorithmError.
- jwt.decode(token: str, key: bytes | str, algorithms: list = ['HS256']) dict#
Verifica la firma de token y (si está presente) su declaración
exp, y devuelve el diccionario de la carga decodificada. Genera una subclase deexceptions.PyJWTErrorante cualquier fallo; quien llama suele capturar la clase base.- token
La cadena JWT compacta producida por
encode()(o por cualquier emisor compatible).- key
El secreto HMAC compartido. Debe coincidir con la clave utilizada en el momento de la codificación.
- algorithms
La lista de algoritmos que quien llama está dispuesto a aceptar.
HS256debe estar presente, y elalgde la cabecera del token debe figurar en la lista. El valor predeterminado es["HS256"].
Genera:
exceptions.InvalidAlgorithmError:HS256no está en algorithms, o elalgde la cabecera del token es cualquier cosa distinta deHS256.exceptions.InvalidTokenError: el token está mal formado (no se divide en tres segmentos Base64-URL, o un segmento no se decodifica/analiza como JSON).exceptions.InvalidSignatureError: la firma no coincide con el HMAC recalculado sobre la cabecera y la carga.exceptions.ExpiredSignatureError: la carga contiene una declaraciónexpcuyo valor es menor que la hora Unix actual. El reloj de la cámara debe estar configurado para que esta comprobación tenga sentido; consultantptime.settime().
Excepciones#
Todas las excepciones están anidadas bajo el atributo de módulo jwt.exceptions.
- exception exceptions.PyJWTError#
Clase base para cada fallo de JWT. Captúrala si no necesitas distinguir entre los casos siguientes.
- exception exceptions.InvalidTokenError#
El token es estructuralmente inválido: número incorrecto de segmentos, un segmento que falla al decodificar en Base64, o JSON que no se puede analizar. Subclase de
exceptions.PyJWTError.
- exception exceptions.InvalidAlgorithmError#
El algoritmo del token no está en la lista aceptada por quien llama, o quien llama solicitó un algoritmo distinto de
HS256. Subclase deexceptions.PyJWTError.
- exception exceptions.InvalidSignatureError#
La firma del token no coincide con el HMAC calculado a partir de la cabecera y la carga usando la clave proporcionada. Subclase de
exceptions.PyJWTError.
- exception exceptions.ExpiredSignatureError#
La declaración
expdel token está en el pasado. Subclase deexceptions.PyJWTError. La hora del reloj de la cámara debe estar configurada (mediantentptime.settime()) para que esta comprobación tenga sentido.
Ejemplo#
Un ciclo de emisión/verificación con secreto simétrico:
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"])
Se usa el mismo secreto para firmar y verificar, por lo que el verificador debe poseer la clave que utilizó el emisor. En servicios donde la cámara es el emisor (que reparte tokens a un teléfono emparejado), mantén el secreto en el sistema de archivos de la cámara y trátalo como cualquier otra credencial de larga duración; consulta Operaciones: claves, caducidad y resolución de problemas.