Mensaje de error
oidc: expected audience "api-client" got ["web-client"]
coreos/go-oidc (Go) — IDTokenVerifier.Verify
Qué significa
El token de ID está firmado por el proveedor correcto, pero su claim `aud` no contiene el `ClientID` configurado en `oidc.Config`. go-oidc aplica la regla de OpenID Connect según la cual un token de ID solo es válido para el cliente al que se emitió; el primer valor entre comillas es tu `ClientID`, y la lista son las audiencias del token.
Por qué ocurre
Se reenvió el token de ID de otro cliente
frecuenteUn frontend envía su token de ID a una API de backend, que lo verifica con el ID de cliente propio de la API. Los tokens de ID están destinados al cliente que los solicitó; las API deberían recibir tokens de acceso.
El ID de cliente configurado es incorrecto
frecuenteSe copió el ID de cliente de otro registro de aplicación o de otro entorno, o se usó el nombre del secreto de cliente en lugar del ID. El `aud` del token muestra el valor correcto.
Verificación de un token de acceso como si fuera un token de ID
ocasionalLos tokens de acceso JWT llevan en `aud` el identificador de la API, no el ID de cliente. `IDTokenVerifier` busca el ID de cliente de forma predeterminada, así que los tokens de acceso fallan a menos que compruebes tú mismo la audiencia.
Cómo solucionarlo
- 1.
Usar el ID de cliente de la aplicación con la que inició sesión el usuario
Para los tokens de ID, configura exactamente el ID de cliente para el que se emitió el token.
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 los tokens de acceso de una API, comprobar por tu cuenta la audiencia de la API
`SkipClientIDCheck` solo desactiva la comparación integrada del ID de cliente. Sustitúyela por una comprobación explícita del identificador de tu API; nunca omitas por completo la validación de la audiencia.
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") }