Mensaje de error
jwt audience invalid. expected: <audience>
El marcador de posición se rellena con el valor que configuras, por ejemplo, «jwt audience invalid. expected: api://orders».
Qué significa
El token superó la verificación criptográfica, pero su claim (declaración) aud no coincide con la audiencia que exige tu verificador. La comprobación de la audiencia existe para que un token emitido para una API no pueda reutilizarse contra otra: la firma demuestra quién emitió el token, mientras que aud demuestra para qué servicio se emitió, y ambas comprobaciones deben superarse antes de que se pueda confiar en los claims.
Por qué ocurre
El identificador no coincide exactamente
frecuenteLa comparación de aud exige que las cadenas sean idénticas. https://api.example.com frente a https://api.example.com/ (barra final), http frente a https, o un ID de cliente frente a un identificador de API: cualquiera de estas diferencias hace fallar la comprobación. Los proveedores OAuth suelen poner el client_id en aud a menos que solicites una audiencia concreta.
El token se emitió para otra API
frecuenteEl cliente obtiene un token para el servicio A y lo envía al servicio B. Es habitual cuando un mismo proveedor de identidad da servicio a varias API: el parámetro audience de la solicitud del token debe nombrar la API ante la que se presentará el token.
aud es un array y las expectativas difieren
ocasionalaud puede ser legítimamente un array de cadenas. jsonwebtoken da por buena la coincidencia si cualquier elemento es igual a cualquiera de los valores esperados, pero el código que valida aud a mano de antemano, suponiendo que es una cadena simple, falla con los claims cuyo valor es un array.
Cómo solucionarlo
- 1.
Comparar lo que lleva el token con lo que esperas
Imprime los dos lados. Corrige el que esté mal: la opción audience del verificador o el parámetro audience/resource que usa el cliente al solicitar el token.
js const { aud } = jwt.decode(token); console.log("token aud:", aud); // e.g. "api://orders" or ["api://orders"] jwt.verify(token, key, { algorithms: ["ES256"], audience: "api://orders", // must match exactly (string, array or RegExp) }); - 2.
Aceptar explícitamente las variantes legítimas
Si varios identificadores son realmente válidos para esta API, enuméralos; no elimines la comprobación de audiencia para que desaparezca el error.
js jwt.verify(token, key, { algorithms: ["ES256"], audience: ["api://orders", "https://api.example.com"], });