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

Mensaje de error

missing required "aud" claim

También se muestra como

  • missing required "iss" claim
  • missing required "exp" claim
  • missing required "sub" claim
  • missing required "iat" claim

El nombre del claim cambia según el claim que falte (`"aud"`, `"iss"`, `"exp"`, `"sub"`, `"iat"`…). `err.claim` contiene el nombre y `err.reason` vale `"missing"`.

jose (JavaScript) — JWTClaimValidationFailed, code ERR_JWT_CLAIM_VALIDATION_FAILED, reason "missing"

Qué significa

El token no contiene un claim (declaración) que tus opciones de verificación hacen obligatorio. jose considera obligatorio un claim no solo cuando lo incluyes en `requiredClaims`, sino también siempre que le pides que lo compruebe: `audience` exige `aud`, `issuer` exige `iss`, `subject` exige `sub` y `maxTokenAge` exige `iat`. El nombre del claim entre comillas indica cuál falta; la firma ya era válida.

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Registrar el claim que falta y los claims presentes

    El objeto de error expone `claim`, `reason` y el `payload` decodificado. Registrarlos permite distinguir «el emisor no lo escribe» de «se envió el token equivocado» con una sola solicitud.

    js
    import { errors, jwtVerify } from "jose";
    
    try {
      await jwtVerify(token, jwks, { algorithms: ["ES256"], audience: "https://api.example.com" });
    } catch (err) {
      if (err instanceof errors.JWTClaimValidationFailed && err.reason === "missing") {
        console.error("token lacks claim:", err.claim, "claims present:", Object.keys(err.payload));
      }
      throw err;
    }
  2. 2.

    Hacer que el emisor incluya el claim

    Mejor corregir el token que relajar el verificador. `aud`, `iss` y `exp` son lo que hace seguro aceptar un JWT; el RFC 8725 recomienda que todos los tokens los lleven.

    js
    import { SignJWT } from "jose";
    
    const token = await new SignJWT({ scope: "orders:read" })
      .setProtectedHeader({ alg: "ES256", kid })
      .setIssuer("https://issuer.example.com")
      .setAudience("https://api.example.com")   // the claim the verifier requires
      .setIssuedAt()
      .setExpirationTime("10m")
      .sign(privateKey);

Errores relacionados

Explorar toda la base de datos de errores de firma