Mensagem de erro
oidc: expected audience "api-client" got ["web-client"]
coreos/go-oidc (Go) — IDTokenVerifier.Verify
O que significa
O token de ID foi assinado pelo provedor certo, mas a claim `aud` dele não contém o `ClientID` que você configurou em `oidc.Config`. O go-oidc implementa a regra do OpenID Connect segundo a qual um token de ID só é válido para o cliente para o qual foi emitido; o primeiro valor entre aspas é o seu `ClientID`, e a lista traz os públicos-alvo do token.
Por que acontece
O token de ID de outro cliente foi encaminhado
comumUm front-end envia o próprio token de ID para uma API de back-end, que o verifica com o ID do cliente da própria API. Tokens de ID se destinam ao cliente que os solicitou; as APIs deveriam receber tokens de acesso.
O ID do cliente configurado está errado
comumO ID do cliente foi copiado de outro registro de aplicativo ou de outro ambiente, ou foi usado o nome do client secret em vez do ID. O `aud` do token mostra o valor correto.
Um token de acesso verificado como se fosse um token de ID
ocasionalTokens de acesso JWT trazem o identificador da API em `aud`, e não o ID do cliente. Por padrão, o `IDTokenVerifier` procura o ID do cliente, então tokens de acesso falham, a menos que você mesmo verifique o público-alvo.
Como corrigir
- 1.
Usar o ID do cliente do aplicativo em que o usuário fez login
Para tokens de ID, configure exatamente o ID do cliente para o qual o token foi emitido.
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.
Para tokens de acesso de API, verificar por conta própria o público-alvo da API
O `SkipClientIDCheck` só desativa a comparação embutida com o ID do cliente. Substitua-a por uma verificação explícita do identificador da sua API — nunca abra mão completamente da validação do público-alvo.
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") }