Mensaje de error
oidc: malformed jwt: unexpected signature algorithm "ES256"; expected ["RS256"]
También se muestra como
- oidc: id token signed with unsupported algorithm, expected ["RS256"] got "ES256"
go-oidc v3.0–v3.5 comprobaba el algoritmo después del análisis y lo formulaba como «oidc: id token signed with unsupported algorithm, expected [\"RS256\"] got \"ES256\"»; las versiones posteriores (comprobado en v3.10, v3.14, v3.17 y v3.21) lo rechazan durante el análisis, de ahí «malformed jwt».
coreos/go-oidc (Go) — IDTokenVerifier.Verify with the default SupportedSigningAlgs
Qué significa
El token de ID está firmado con un algoritmo que no figura en el `SupportedSigningAlgs` del verificador. Cuando esa lista está vacía y el verificador no se creó a partir de un proveedor descubierto, go-oidc recurre solo a RS256 —el valor predeterminado que exige la especificación de OpenID Connect—, así que cualquier token ES256, PS256 o EdDSA se rechaza antes de comprobar su firma. go-oidc lo notifica como «malformed jwt» porque la comprobación ocurre mientras analiza el JWS.
Por qué ocurre
Verificador creado a mano sin algoritmos
frecuente`oidc.NewVerifier(issuer, keySet, &oidc.Config{ClientID: …})` sin `SupportedSigningAlgs` solo acepta RS256. Los proveedores que firman con ES256 (y muchos autoalojados lo hacen) fallan de inmediato.
El proveedor cambió su algoritmo de firma
ocasionalUn verificador con una lista explícita deja de funcionar cuando el proveedor rota a una clave de otro tipo. Los verificadores basados en el descubrimiento toman el nuevo valor de `id_token_signing_alg_values_supported`.
El token no es de este proveedor
ocasionalLos tokens de otro emisor con un algoritmo distinto tropiezan con esta comprobación antes que con la del emisor.
Cómo solucionarlo
- 1.
Indicar explícitamente el algoritmo del proveedor
Asigna a `SupportedSigningAlgs` el algoritmo o los algoritmos que usa el proveedor. Mantén la lista corta: es una lista de permitidos.
go verifier := oidc.NewVerifier(issuer, keySet, &oidc.Config{ ClientID: clientID, SupportedSigningAlgs: []string{oidc.ES256}, // what the provider actually signs with }) - 2.
Dejar que el descubrimiento proporcione los algoritmos
`provider.Verifier` lee los algoritmos admitidos de los metadatos del proveedor, así que no hay nada que mantener sincronizado a mano.
go // provider.Verifier takes the algorithms from id_token_signing_alg_values_supported. provider, err := oidc.NewProvider(ctx, issuer) if err != nil { return err } verifier := provider.Verifier(&oidc.Config{ClientID: clientID})