Pular para o conteúdo
ecdsa.com
jose (JavaScript)Bibliotecas de JWT

Mensagem de erro

missing required "aud" claim

Também aparece como

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

O nome da claim muda conforme a claim ausente (`"aud"`, `"iss"`, `"exp"`, `"sub"`, `"iat"`…). `err.claim` contém o nome, e `err.reason` é `"missing"`.

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

O que significa

O token não contém uma claim que suas opções de verificação tornam obrigatória. O jose trata uma claim como obrigatória não só quando você a lista em `requiredClaims`, mas também sempre que você pede que ele verifique essa claim: `audience` exige `aud`, `issuer` exige `iss`, `subject` exige `sub` e `maxTokenAge` exige `iat`. O nome da claim entre aspas indica qual delas está ausente; a assinatura já era válida.

Por que acontece

Como corrigir

  1. 1.

    Registrar no log a claim ausente e as claims presentes

    O objeto de erro expõe `claim`, `reason` e o `payload` decodificado. Registrá-los no log distingue “o emissor não inclui a claim” de “foi enviado o token errado” com uma única requisição.

    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.

    Fazer o emissor incluir a claim

    Prefira corrigir o token a afrouxar o verificador. `aud`, `iss` e `exp` são o que torna um JWT seguro para aceitar; a RFC 8725 recomenda que todo token traga essas claims.

    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);

Erros relacionados

Ver toda a base de erros de assinatura