Перейти к содержимому
ecdsa.com
coreos/go-oidc (Go)Go

Сообщение об ошибке

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

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

Что это означает

ID-токен подписан нужным провайдером, но его утверждение `aud` не содержит `ClientID`, заданный в `oidc.Config`. go-oidc реализует правило OpenID Connect, по которому ID-токен действителен только для клиента, которому он выдан; первое значение в кавычках — ваш `ClientID`, а список — аудитории токена.

Почему это происходит

Как исправить

  1. 1.

    Используйте идентификатор клиента приложения, через которое вошёл пользователь

    Для 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` отключает только встроенное сравнение с идентификатором клиента. Замените его явной проверкой идентификатора вашего 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")
    }

Связанные ошибки

Открыть всю базу ошибок подписей