Saltar al contenido
ecdsa.com
PyJWT (Python)Bibliotecas de JWT

Mensaje de error

It is required that you pass in a value for the "algorithms" argument when calling decode().

PyJWT (Python) — jwt.exceptions.DecodeError

Qué significa

Desde PyJWT 2.0, jwt.decode() se niega a ejecutarse si no se le pasa explícitamente la lista algorithms. No es pedantería: deducir el algoritmo del propio encabezado del token permite ataques de confusión de algoritmos (por ejemplo, verificar un token HS256 usando una clave pública RSA como secreto HMAC). El verificador —configurado del lado del servidor, fuera del alcance del atacante— debe indicar qué acepta, y PyJWT impone ese contrato a nivel de API para que la forma insegura de la llamada sea sencillamente imposible de escribir.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Indicar el algoritmo explícitamente

    Pasa exactamente el algoritmo o los algoritmos que usa tu emisor; para los tokens firmados con ECDSA, normalmente ES256. Si por un mismo servicio pasan varios tipos de token, da a cada emisor su propia lista de permitidos en lugar de juntarlos todos en una sola lista permisiva.

    python
    import jwt
    
    payload = jwt.decode(
        token,
        public_key_pem,
        algorithms=["ES256"],       # required — and a security control, not boilerplate
        audience="api://orders",
    )
  2. 2.

    Para inspeccionar sin verificar, indicarlo explícitamente

    Si solo necesitas leer los claims (depuración, registro), desactiva la verificación de forma deliberada, y nunca uses el resultado para tomar decisiones de autorización.

    python
    claims = jwt.decode(token, options={"verify_signature": False})
    # or just the header:
    header = jwt.get_unverified_header(token)

Errores relacionados

Explorar toda la base de datos de errores de firma