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

错误信息

oidc: expected audience "api-client" got ["web-client"]

coreos/go-oidc (Go) — IDTokenVerifier.Verify

含义

ID 令牌由正确的提供商签名,但其 `aud` 声明中不包含你在 `oidc.Config` 中配置的 `ClientID`。go-oidc 实现了 OpenID Connect 的规则:ID 令牌只对签发时指定的客户端有效;第一个带引号的值是你的 `ClientID`,列表则是令牌的受众。

原因

修复方法

  1. 1.

    使用让用户登录的那个应用的客户端 ID

    对于 ID 令牌,准确配置令牌签发时指定的那个客户端 ID。

    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. 2.

    对于 API 访问令牌,自行检查 API 受众

    `SkipClientIDCheck` 只会禁用内置的客户端 ID 比较。要用针对你的 API 标识符的显式检查来替代它——切勿完全跳过受众校验。

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

相关错误

浏览完整的签名错误库