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ódigo escrito para PyJWT 1.x
frecuentePyJWT 1.x permitía jwt.decode(token, key) y adivinaba el algoritmo. La versión 2.0 (2020) hizo obligatorio algorithms; cualquier actualización de dependencias que cruce ese límite hace aflorar este error en código que antes funcionaba.
Un tutorial o un fragmento de código generado por un LLM lo omitía
frecuenteMuchos ejemplos antiguos de la web siguen mostrando llamadas a decode() con dos argumentos. El fragmento de código funciona bien en entornos fijados a PyJWT 1.x y falla en cualquier instalación moderna.
Una función auxiliar de autenticación compartida oculta la llamada a decode
ocasionalCuando una pequeña utilidad interna envuelve jwt.decode(), una actualización de PyJWT rompe a la vez todos los servicios que importan esa función auxiliar, y el traceback apunta al envoltorio en lugar de al código que lo llama. Las integraciones con frameworks (Flask-JWT-Extended, DRF SimpleJWT) pasan algorithms internamente; los envoltorios hechos a mano son el lugar habitual de la omisión.
Cómo solucionarlo
- 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.
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)