Fehlermeldung
oidc: issuer URL provided to client ("https://accounts.example.com") did not match the issuer URL returned by provider ("https://accounts.example.com/")
Auch ausgegeben als
- oidc: issuer did not match the issuer returned by provider, expected "https://accounts.example.com" got "https://accounts.example.com/"
Die beiden URLs in Anführungszeichen sind dein konfigurierter Aussteller und der `issuer` des Providers. go-oidc v3.0–v3.16 gab „oidc: issuer did not match the issuer returned by provider, expected \"…\" got \"…\"“ aus; der aktuelle Wortlaut und der Typ `IssuerMismatchError` kamen mit v3.17.0.
coreos/go-oidc (Go) — *oidc.IssuerMismatchError from oidc.NewProvider
Was der Fehler bedeutet
`oidc.NewProvider` hat das Discovery-Dokument von der Aussteller-URL abgerufen, die du übergeben hast, und das Feld `issuer` des Dokuments entspricht nicht exakt dieser URL. OpenID Connect Discovery verlangt, dass beide identisch sind, und go-oidc setzt das durch, weil der Claim `iss` jedes ID-Tokens mit dem Wert von `issuer` verglichen wird. Die erste URL in Anführungszeichen ist deine, die zweite die des Providers.
Warum der Fehler auftritt
Unterschied beim Schrägstrich am Ende
häufigAussteller von Auth0 enden mit `/`, die meisten anderen nicht. `https://tenant.auth0.com` und `https://tenant.auth0.com/` sind für den Vergleich unterschiedliche Strings.
Fehlendes oder abweichendes Pfadsegment
häufigKeycloak `…/realms/<realm>`, Entra ID `…/<tenant>/v2.0`, Okta `…/oauth2/default`. Zeigst du auf den Host ohne den Pfad oder auf den v1-Endpunkt von Entra ID, erhältst du ein Dokument mit abweichendem Aussteller.
Discovery über eine interne Adresse abgerufen
gelegentlichInnerhalb eines Clusters wird der Provider als `http://keycloak:8080/...` erreicht, während er seine öffentliche URL als `issuer` angibt. Die Abweichung ist echt: Tokens tragen den öffentlichen Wert.
So behebst du den Fehler
- 1.
Exakten Aussteller-String konfigurieren
Kopiere `issuer` wörtlich aus dem Discovery-Dokument, einschließlich Schema, Pfad und Schrägstrich am Ende.
bash curl -s https://accounts.example.com/.well-known/openid-configuration | jq -r .issuer # use exactly this string in oidc.NewProvider(ctx, issuer) - 2.
Discovery-URL und Aussteller bewusst trennen
Mit `oidc.InsecureIssuerURLContext` rufst du die Discovery von einer URL ab, während Tokens gegen den öffentlichen Aussteller validiert werden. Verwende das nur für Split-Horizon-Setups, die du selbst verwaltest; der Name erinnert an den Kompromiss.
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")