Message d’erreur
oidc: issuer URL provided to client ("https://accounts.example.com") did not match the issuer URL returned by provider ("https://accounts.example.com/")
Également affiché sous la forme
- oidc: issuer did not match the issuer returned by provider, expected "https://accounts.example.com" got "https://accounts.example.com/"
Les deux URL entre guillemets sont l’émetteur que vous avez configuré et le `issuer` du fournisseur. go-oidc v3.0–v3.16 affichait « oidc: issuer did not match the issuer returned by provider, expected \"…\" got \"…\" » ; la formulation actuelle et le type `IssuerMismatchError` sont apparus dans la v3.17.0.
coreos/go-oidc (Go) — *oidc.IssuerMismatchError from oidc.NewProvider
Ce que cela signifie
`oidc.NewProvider` a récupéré le document de découverte à partir de l’URL d’émetteur que vous lui avez donnée, et le champ `issuer` du document ne correspond pas exactement à cette URL. OpenID Connect Discovery exige que les deux soient identiques, et go-oidc l’impose, car c’est à la valeur `issuer` que sera comparé le `iss` de chaque jeton d’ID. La première URL entre guillemets est la vôtre, la seconde celle du fournisseur.
Pourquoi cela se produit
Différence de barre oblique finale
fréquenteLes émetteurs Auth0 se terminent par `/` ; la plupart des autres non. Pour la comparaison, `https://tenant.auth0.com` et `https://tenant.auth0.com/` sont des chaînes différentes.
Segment de chemin manquant ou différent
fréquenteKeycloak `…/realms/<realm>`, Entra ID `…/<tenant>/v2.0`, Okta `…/oauth2/default`. Pointer vers l’hôte sans le chemin, ou vers le point de terminaison v1 d’Entra ID, renvoie un document dont l’émetteur diffère.
Découverte récupérée via une adresse interne
occasionnelleÀ l’intérieur d’un cluster, le fournisseur est joint via `http://keycloak:8080/...`, alors qu’il annonce son URL publique comme `issuer`. La non-concordance est réelle : les jetons porteront la valeur publique.
Comment corriger l’erreur
- 1.
Configurer la chaîne exacte de l’émetteur
Copiez `issuer` tel quel depuis le document de découverte, y compris le schéma, le chemin et la barre oblique finale.
bash curl -s https://accounts.example.com/.well-known/openid-configuration | jq -r .issuer # use exactly this string in oidc.NewProvider(ctx, issuer) - 2.
Séparer délibérément l’URL de découverte et l’émetteur
`oidc.InsecureIssuerURLContext` vous permet de récupérer la découverte depuis une URL tout en validant les jetons par rapport à l’émetteur public. Ne l’utilisez que pour des configurations split-horizon que vous contrôlez ; son nom rappelle le compromis.
go // Only when discovery must be fetched from an internal address (for example inside Kubernetes) // while tokens carry the public issuer. The verifier still checks iss against the public value. ctx = oidc.InsecureIssuerURLContext(ctx, "https://login.example.com/realms/main") provider, err := oidc.NewProvider(ctx, "http://keycloak.auth.svc.cluster.local:8080/realms/main")