Mensaje de error
Invalid audience
También se muestra como
- jwt.exceptions.InvalidAudienceError: Invalid audience
Compáralo con «Audience doesn't match», que significa que `audience` sí se pasó, pero ningún valor coincidió.
PyJWT (Python) — jwt.exceptions.InvalidAudienceError
Qué significa
El token contiene un claim `aud`, pero se llamó a `jwt.decode()` sin el argumento `audience`. PyJWT no ignora una audiencia que no puede comprobar: un token que nombra a su destinatario se rechaza salvo que indiques qué destinatario eres. El mismo mensaje aparece si `aud` tiene un tipo no válido (ni una cadena ni una lista de cadenas).
Por qué ocurre
El verificador no pasa audience
frecuenteEl código escrito para tokens sin `aud` (o copiado de un ejemplo mínimo) deja de funcionar en cuanto el proveedor de identidad empieza a incluir `aud`, como hace la mayoría en los tokens de acceso y en los tokens de ID. La solución prevista es pasar la audiencia esperada.
Un token de ID en lugar de un token de acceso
ocasionalAlgunos proveedores emiten tokens de acceso sin `aud`, pero siempre ponen el ID de cliente en el `aud` del token de ID (Amazon Cognito es un ejemplo habitual). El código que funciona con tokens de acceso empieza a fallar en cuanto un cliente envía su token de ID.
El claim aud tiene un tipo no válido
raraUn emisor que escribe `aud` como número, como objeto o como lista con elementos que no son cadenas produce un token que PyJWT no puede comparar con nada.
Cómo solucionarlo
- 1.
Indicar a PyJWT qué audiencia eres
Pasa el identificador de tu API (o una lista de identificadores aceptables). No desactives `verify_aud`: esa comprobación es lo que impide que se acepten tokens destinados a otros servicios.
python claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com", # the identifier your API is registered with ) - 2.
Usar la decodificación sin verificación solo para inspeccionar
`verify_signature: False` desactiva todas las comprobaciones, incluida la de audiencia. Sirve para leer `aud` durante la depuración, nunca para autorizar una solicitud.
python # Reading claims without trusting them (debugging, routing) - never for authorization. header = jwt.get_unverified_header(token) claims = jwt.decode(token, options={"verify_signature": False})