Mensagem de erro
oidc: issuer URL provided to client ("https://accounts.example.com") did not match the issuer URL returned by provider ("https://accounts.example.com/")
Também aparece como
- oidc: issuer did not match the issuer returned by provider, expected "https://accounts.example.com" got "https://accounts.example.com/"
As duas URLs entre aspas são o emissor que você configurou e o `issuer` do provedor. O go-oidc v3.0–v3.16 imprimia “oidc: issuer did not match the issuer returned by provider, expected \"…\" got \"…\"”; o texto atual e o tipo `IssuerMismatchError` chegaram na v3.17.0.
coreos/go-oidc (Go) — *oidc.IssuerMismatchError from oidc.NewProvider
O que significa
O `oidc.NewProvider` buscou o documento de descoberta na URL do emissor que você informou, e o campo `issuer` do documento não é exatamente essa URL. O OpenID Connect Discovery exige que as duas sejam idênticas, e o go-oidc impõe essa regra porque é com o valor de `issuer` que o `iss` de cada token de ID será comparado. A primeira URL entre aspas é a sua; a segunda, a do provedor.
Por que acontece
Diferença na barra final
comumOs emissores do Auth0 terminam com `/`; a maioria dos outros, não. Para a comparação, `https://tenant.auth0.com` e `https://tenant.auth0.com/` são strings diferentes.
Segmento de caminho ausente ou diferente
comumKeycloak `…/realms/<realm>`, Entra ID `…/<tenant>/v2.0`, Okta `…/oauth2/default`. Apontar para o host sem o caminho, ou para o endpoint v1 do Entra ID, retorna um documento com outro emissor.
Documento de descoberta buscado por um endereço interno
ocasionalDentro de um cluster, o provedor é acessado como `http://keycloak:8080/...`, enquanto divulga a URL pública como `issuer`. A divergência é real: os tokens vão trazer o valor público.
Como corrigir
- 1.
Configurar a string exata do emissor
Copie o `issuer` do documento de descoberta exatamente como está, incluindo o esquema, o caminho e a barra final.
bash curl -s https://accounts.example.com/.well-known/openid-configuration | jq -r .issuer # use exactly this string in oidc.NewProvider(ctx, issuer) - 2.
Separar de propósito a URL de descoberta e o emissor
O `oidc.InsecureIssuerURLContext` permite buscar o documento de descoberta em uma URL e validar os tokens com base no emissor público. Use-o só em configurações de split-horizon que você controla; o nome serve de lembrete do risco que você aceita.
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")