Mensaje de error
Audience doesn't match
También se muestra como
- jwt.exceptions.InvalidAudienceError: Audience doesn't match
PyJWT (Python) — jwt.exceptions.InvalidAudienceError
Qué significa
El token tiene un claim `aud` y le pasas `audience=` a `jwt.decode()`, pero ningún valor coincide. PyJWT acepta el token cuando al menos una de las audiencias del token es igual a una de las audiencias que permites; aquí no coincidió ninguna. La firma era válida: el token se emitió para otro destinatario.
Por qué ocurre
El token se emitió para otra API
frecuenteCon un único proveedor de identidad delante de varios servicios, un cliente puede enviar fácilmente al servicio B un token emitido para el servicio A. Rechazarlo es precisamente el objetivo de la comprobación de audiencia.
El mismo identificador escrito de otra forma
frecuenteLa comparación de cadenas es exacta: una barra final, `http` frente a `https`, un ID de cliente frente a una URL de identificador de API o las mayúsculas cuentan como audiencias distintas.
Un token de ID llegó a la API
ocasionalLos tokens de ID de OpenID Connect llevan en `aud` el ID de la aplicación cliente. Una API debería recibir tokens de acceso emitidos para ella; reenviar el token de ID falla aquí.
Cómo solucionarlo
- 1.
Comparar el aud del token con tu audiencia
Decodifica sin verificación solo para inspeccionar y luego verifica con el identificador exacto. Si el token se emitió para la audiencia equivocada, cambia la solicitud de token del cliente; si el identificador estaba mal escrito, cambia el verificador.
python unverified = jwt.decode(token, options={"verify_signature": False}) print(repr(unverified.get("aud"))) # str or list[str] claims = jwt.decode( token, signing_key, algorithms=["ES256"], audience="https://api.example.com/orders", # must equal one of the token's aud values issuer="https://issuer.example.com/", ) - 2.
Permitir varios identificadores explícitamente
`audience` acepta una lista. Úsala cuando una API tenga legítimamente varios identificadores; nunca pases `options={"verify_aud": False}` para hacer desaparecer el error.
python # Any one of these may appear in the token's aud. claims = jwt.decode(token, signing_key, algorithms=["ES256"], audience=["orders-api", "https://api.example.com/orders"])