Fehlermeldung
oidc: expected audience "api-client" got ["web-client"]
coreos/go-oidc (Go) — IDTokenVerifier.Verify
Was der Fehler bedeutet
Das ID-Token ist vom richtigen Provider signiert, aber sein Claim `aud` enthält nicht die `ClientID`, die du in `oidc.Config` konfiguriert hast. go-oidc setzt die Regel von OpenID Connect um, nach der ein ID-Token nur für den Client gültig ist, für den es ausgestellt wurde; der erste Wert in Anführungszeichen ist deine `ClientID`, die Liste enthält die Audiences des Tokens.
Warum der Fehler auftritt
Das ID-Token eines anderen Clients wurde weitergereicht
häufigEin Frontend sendet sein ID-Token an eine Backend-API, die es mit ihrer eigenen Client-ID prüft. ID-Tokens sind für den Client bestimmt, der sie angefordert hat; APIs sollten Access Tokens erhalten.
Die konfigurierte Client-ID ist falsch
häufigDie Client-ID einer anderen App-Registrierung oder Umgebung wurde kopiert, oder statt der ID wurde der Name des Client-Secrets verwendet. `aud` im Token zeigt den richtigen Wert.
Ein Access Token wird wie ein ID-Token geprüft
gelegentlichAccess Tokens im JWT-Format tragen in `aud` den Bezeichner der API, nicht die Client-ID. `IDTokenVerifier` prüft standardmäßig auf die Client-ID, deshalb scheitern Access Tokens, wenn du die Audience nicht selbst prüfst.
So behebst du den Fehler
- 1.
Client-ID der App verwenden, die den Nutzer angemeldet hat
Konfiguriere für ID-Tokens genau die Client-ID, für die das Token ausgestellt wurde.
go verifier := provider.Verifier(&oidc.Config{ ClientID: os.Getenv("OIDC_CLIENT_ID"), // the client the user signed in to; must equal the token's aud }) idToken, err := verifier.Verify(ctx, rawIDToken) - 2.
Bei Access Tokens für APIs die Audience der API selbst prüfen
`SkipClientIDCheck` schaltet nur den eingebauten Vergleich mit der Client-ID ab. Ersetze ihn durch eine explizite Prüfung auf den Bezeichner deiner API – überspringe die Prüfung der Audience nie ganz.
go // Verifying a JWT access token for an API: check signature/issuer/expiry here, // then check the API audience yourself. verifier := provider.Verifier(&oidc.Config{SkipClientIDCheck: true}) tok, err := verifier.Verify(ctx, rawAccessToken) if err != nil { return err } if !slices.Contains(tok.Audience, "https://api.example.com") { return errors.New("token not issued for this API") }