PyJWT codifica y decodifica JSON Web Tokens con jwt.encode() y jwt.decode(), y obtiene las claves de firma de un endpoint JWKS con PyJWKClient. Los algoritmos asimétricos vienen del extra crypto, que instala pyca/cryptography; con él, la 2.15.1 admitió las familias HS, RS, PS y ES, ES256K y EdDSA, pero no los nombres más recientes Ed25519 y Ed448, que lanzaron NotImplementedError: Algorithm not supported.
Sus valores predeterminados de verificación son estrictos. jwt.decode() sin algorithms falla con It is required that you pass in a value for the "algorithms" argument, un token alg: none sin firmar nunca se verificó —ni siquiera con algorithms=["none"]— y una clave pública PEM u OpenSSH usada como secreto HS256 se rechazó con InvalidKeyError. ES256 está ligado a P-256: firmar con una clave P-384 falló por una discrepancia de curva.
Lo que deja en tus manos: exp es opcional, así que un token sin él se decodifica indefinidamente salvo que lo incluyas en require dentro del argumento options, y leeway vale cero por defecto, así que servidores con unos segundos de diferencia ya discrepan sobre la caducidad. Los secretos HMAC cortos se aceptan con solo un InsecureKeyLengthWarning, fácil de pasar por alto en los registros: prueba un secreto con el comprobador de secretos JWT.
Las firmas ES256 tienen la forma r‖s en bruto de 64 bytes que exige JWS; un token cuya firma se armó en DER —por ejemplo, a partir de una llamada de firma a un KMS— falla con el error genérico Signature verification failed. Pega el token en el decodificador de JWT para ver la longitud de la firma y conviértela con el conversor DER ⇄ en bruto.
El ejemplo fija el algoritmo, el emisor y la audiencia, exige exp y admite 30 segundos de desfase: los cuatro ajustes que hacen que sea seguro llamar a jwt.decode() con tokens de otro servicio.