Saltar al contenido
ecdsa.com
golang-jwt/jwt (Go)Go

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

Cómo solucionarlo

  1. 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. 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"])
    }

Errores relacionados

Explorar toda la base de datos de errores de firma