跳到主要内容
ecdsa.com
coreos/go-oidc (Go)Go

错误信息

oidc: issuer URL provided to client ("https://accounts.example.com") did not match the issuer URL returned by provider ("https://accounts.example.com/")

也可能输出为

  • oidc: issuer did not match the issuer returned by provider, expected "https://accounts.example.com" got "https://accounts.example.com/"

两个带引号的 URL 分别是你配置的颁发者和提供商的 `issuer`。go-oidc v3.0~v3.16 打印的是“oidc: issuer did not match the issuer returned by provider, expected \"…\" got \"…\"”;当前的措辞和 `IssuerMismatchError` 类型是在 v3.17.0 中引入的。

coreos/go-oidc (Go) — *oidc.IssuerMismatchError from oidc.NewProvider

含义

`oidc.NewProvider` 从你提供的颁发者 URL 获取了发现文档,而文档中的 `issuer` 字段与该 URL 不完全相同。OpenID Connect Discovery 要求两者完全一致;go-oidc 强制执行这一点,因为每个 ID 令牌的 `iss` 都要与 `issuer` 值比较。第一个带引号的 URL 是你的,第二个是提供商的。

原因

修复方法

  1. 1.

    配置完全一致的颁发者字符串

    从发现文档中原样复制 `issuer`,包括协议、路径和末尾斜杠。

    bash
    curl -s https://accounts.example.com/.well-known/openid-configuration | jq -r .issuer
    # use exactly this string in oidc.NewProvider(ctx, issuer)
  2. 2.

    有意将发现 URL 与颁发者分开

    使用 `oidc.InsecureIssuerURLContext`,可以从一个 URL 获取发现文档,同时按公共颁发者校验令牌。只在你能控制的内外网分离(split-horizon)部署中使用它;这个名称就是在提醒其中的取舍。

    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")

相关错误

浏览完整的签名错误库