Saltar al contenido
ecdsa.com
jose (JavaScript)Bibliotecas de JWT

Mensaje de error

unexpected "aud" claim value

jose (JavaScript) — JWTClaimValidationFailed, code ERR_JWT_CLAIM_VALIDATION_FAILED

Qué significa

La firma se verificó, pero el claim (declaración) `aud` del token no contiene el valor que pasas como `audience` a `jwtVerify`. jose compara las cadenas de forma exacta: la comprobación se supera cuando al menos un valor del `aud` del token (una cadena o un array) es igual a una de las audiencias que permites. El token es auténtico; simplemente se emitió para otro destinatario, así que aceptarlo permitiría que un token emitido para una API se reutilizara contra otra.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Imprimir lo que lleva el token junto a lo que esperas

    Decodifica los claims sin confiar en ellos y compara `aud` con tu opción `audience` carácter a carácter. Corrige el lado que esté mal —la opción del verificador o la configuración del emisor—, pero mantén la comprobación.

    js
    import { decodeJwt, jwtVerify } from "jose";
    
    console.log("token aud:", decodeJwt(token).aud); // string or array of strings
    
    await jwtVerify(token, jwks, {
      algorithms: ["ES256"],
      issuer: "https://issuer.example.com",
      audience: "https://api.example.com/orders", // exact string match
    });
  2. 2.

    Solicitar un token para la API a la que llamas

    Cuando el token se emitió para otra audiencia, la corrección corresponde al cliente: indica la API de destino en la solicitud del token para que el servidor de autorización la ponga en `aud`.

    bash
    # OAuth 2.0 client credentials: ask the authorization server for a token
    # minted for the API you are about to call (Auth0 uses "audience",
    # RFC 8707 resource indicators use "resource").
    curl -s https://issuer.example.com/oauth/token \
      -d grant_type=client_credentials \
      -d client_id="$CLIENT_ID" -d client_secret="$CLIENT_SECRET" \
      -d audience=https://api.example.com/orders
  3. 3.

    Permitir varios identificadores de forma explícita, si todos son tuyos

    `audience` acepta un array. Enumera todos los identificadores que designan legítimamente a esta API (por ejemplo, durante una migración de una URL a un nombre lógico) en lugar de quitar la opción: sin `audience`, jose no comprueba `aud` en absoluto.

    js
    await jwtVerify(token, jwks, {
      algorithms: ["ES256"],
      audience: ["https://api.example.com/orders", "orders-api"], // any one must match
    });

Errores relacionados

Explorar toda la base de datos de errores de firma