Zum Inhalt springen
ecdsa.com
jose (JavaScript)JWT-Bibliotheken

Fehlermeldung

unexpected "aud" claim value

jose (JavaScript) — JWTClaimValidationFailed, code ERR_JWT_CLAIM_VALIDATION_FAILED

Was der Fehler bedeutet

Die Signatur wurde erfolgreich geprüft, aber der Claim `aud` des Tokens enthält nicht den Wert, den du `jwtVerify` als `audience` übergeben hast. jose vergleicht Strings exakt: Die Prüfung ist bestanden, wenn mindestens ein Wert in `aud` des Tokens (ein String oder ein Array) einer der von dir erlaubten Audiences entspricht. Das Token ist echt – es wurde nur für einen anderen Empfänger ausgestellt. Würdest du es akzeptieren, ließe sich ein für eine API ausgestelltes Token bei einer anderen erneut vorlegen.

Warum der Fehler auftritt

So behebst du den Fehler

  1. 1.

    Inhalt des Tokens neben dem erwarteten Wert ausgeben

    Dekodiere die Claims, ohne ihnen zu vertrauen, und vergleiche `aud` Zeichen für Zeichen mit deiner Option `audience`. Korrigiere die Seite, die falsch ist – die Option des Prüfers oder die Konfiguration des Ausstellers –, aber behalte die Prüfung bei.

    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.

    Token für die API anfordern, die du aufrufst

    Wurde das Token für eine andere Audience ausgestellt, gehört die Korrektur in den Client: Nenne die Ziel-API in der Token-Anfrage, damit der Autorisierungsserver sie in `aud` einträgt.

    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.

    Mehrere Bezeichner explizit zulassen, wenn sie alle dir gehören

    `audience` akzeptiert ein Array. Liste jeden Bezeichner auf, der diese API legitim benennt (etwa bei einer Migration von einer URL auf einen logischen Namen), statt die Option zu entfernen – ohne `audience` prüft jose `aud` überhaupt nicht.

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

Verwandte Fehler

Gesamte Signaturfehler-Datenbank durchsuchen