Mensaje de error
token signature is invalid: signing method ES256 is invalid
También se muestra como
- signing method ES256 is invalid
- token signature is invalid: signing method HS256 is invalid
- token is unverifiable: signing method (alg) is unavailable
La v4 imprime «signing method ES256 is invalid». Un valor de `alg` que golang-jwt no conoce en absoluto (o `none` sin la constante especial) produce en cambio «token is unverifiable: signing method (alg) is unavailable».
golang-jwt/jwt (Go) — WithValidMethods rejected the token's alg
Qué significa
El encabezado `alg` del token no está en la lista que pasas con `jwt.WithValidMethods`, así que golang-jwt lo rechaza antes de llamar a tu Keyfunc para obtener la clave. La comprobación existe porque el encabezado está bajo el control de un posible atacante: es el verificador, no el token, quien decide qué algoritmo es aceptable. La v5 lo clasifica como `ErrTokenSignatureInvalid`, lo que hace que parezca una firma incorrecta, pero es un rechazo por la política de algoritmos.
Por qué ocurre
Cambio de algoritmo en el emisor
frecuenteLos proveedores de identidad pasan de RS256 a ES256 o añaden claves EdDSA. Los verificadores que fijaron el algoritmo antiguo rechazan todos los tokens nuevos desde el momento del cambio.
Lista de permitidos copiada de otro servicio
ocasionalUn middleware compartido configurado para un emisor (RS256) se reutiliza para otro que firma con ES256. La lista de permitidos debe describir el emisor que está detrás de este verificador concreto.
Un token de otro origen, o un sondeo
ocasionalLos tokens con `alg: HS256` o `none` que llegan a una API RS256/ES256 son típicos de los sondeos de confusión de algoritmos. Sigue rechazándolos.
Cómo solucionarlo
- 1.
Permitir exactamente el algoritmo del emisor
Lee el JWKS del emisor (el `alg` de cada clave) o su documento de descubrimiento (`id_token_signing_alg_values_supported`) y fija esos valores. Durante una migración, incluye los dos algoritmos y selecciona las claves por `kid`.
go token, err := jwt.Parse(raw, keyfunc, jwt.WithValidMethods([]string{"ES256"}), // what the issuer signs with today jwt.WithIssuer("https://issuer.example.com/"), ) - 2.
Comprobar el tipo del método en la Keyfunc
Comprobar el tipo concreto de `t.Method` en la Keyfunc garantiza que una clave ECDSA solo se use con un algoritmo ECDSA, aunque más adelante se amplíe la lista de permitidos.
go keyfunc := func(t *jwt.Token) (any, error) { // Belt and braces: the key type must fit the algorithm family. if _, ok := t.Method.(*jwt.SigningMethodECDSA); !ok { return nil, fmt.Errorf("unexpected signing method %v", t.Header["alg"]) } return lookupKey(t.Header["kid"]) }