Message d’erreur
oidc: expected audience "api-client" got ["web-client"]
coreos/go-oidc (Go) — IDTokenVerifier.Verify
Ce que cela signifie
Le jeton d’ID est signé par le bon fournisseur, mais son claim `aud` ne contient pas le `ClientID` que vous avez configuré dans `oidc.Config`. go-oidc applique la règle d’OpenID Connect selon laquelle un jeton d’ID n’est valide que pour le client auquel il a été émis ; la première valeur entre guillemets est votre `ClientID`, la liste contient les audiences du jeton.
Pourquoi cela se produit
Le jeton d’ID d’un autre client a été transmis
fréquenteUn front-end envoie son jeton d’ID à une API back-end, qui le vérifie avec l’ID client propre à l’API. Les jetons d’ID sont destinés au client qui les a demandés ; les API devraient recevoir des jetons d’accès.
L’ID client configuré est erroné
fréquenteCopie de l’ID client d’une autre inscription d’application ou d’un autre environnement, ou utilisation du nom du secret client au lieu de l’ID. Le `aud` du jeton indique la valeur correcte.
Vérification d’un jeton d’accès comme s’il s’agissait d’un jeton d’ID
occasionnelleLes jetons d’accès JWT portent l’identifiant de l’API dans `aud`, et non l’ID client. `IDTokenVerifier` vérifie par défaut la présence de l’ID client : les jetons d’accès échouent donc, sauf si vous vérifiez l’audience vous-même.
Comment corriger l’erreur
- 1.
Utiliser l’ID client de l’application qui a connecté l’utilisateur
Pour les jetons d’ID, configurez exactement l’ID client pour lequel le jeton a été émis.
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.
Jetons d’accès d’API : vérifier vous-même l’audience de l’API
`SkipClientIDCheck` désactive uniquement la comparaison intégrée de l’ID client. Remplacez-la par une vérification explicite de l’identifiant de votre API ; ne renoncez jamais complètement à la validation de l’audience.
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") }