Mensaje de error
Expected a different algorithm (JWT::IncorrectAlgorithm)
También se muestra como
- JWT::IncorrectAlgorithm: Expected a different algorithm
ruby-jwt (Ruby) — JWT::IncorrectAlgorithm from JWT.decode
Qué significa
El encabezado `alg` del token no está entre los algoritmos que permites y, si no pasas ninguna opción `algorithm:`/`algorithms:`, ruby-jwt no permite ninguno. Desde ruby-jwt 2.x, el verificador debe nombrar el algoritmo explícitamente, porque confiar en el propio encabezado del token es el origen de los conocidos ataques de confusión de algoritmos. La firma no se comprobó.
Por qué ocurre
JWT.decode sin ningún algoritmo
frecuenteEl código de los tutoriales de ruby-jwt 1.x llama a `JWT.decode(token, key, true)`. En ese caso, las versiones actuales rechazan todos los tokens con este error.
El emisor usa un algoritmo distinto del configurado
frecuenteUna migración de RS256 a ES256 (o de HS256 a un algoritmo asimétrico) en el lado del emisor rompe los verificadores que siguen fijando el valor anterior.
Un token de otro emisor o un sondeo
ocasionalLos tokens con `alg: none` o `HS256` enviados a una API que verifica RS256/ES256 se rechazan aquí, como debe ser.
Cómo solucionarlo
- 1.
Nombrar explícitamente el algoritmo del emisor
Pasa `algorithm:` (o `algorithms:` para una lista corta). Con varios algoritmos, usa un cargador de JWKS para que cada token se verifique con una clave del tipo correspondiente.
ruby payload, header = JWT.decode(token, public_key, true, algorithm: "ES256") # several allowed algorithms (e.g. during a migration), each matched to the right key type: payload, header = JWT.decode(token, nil, true, algorithms: ["ES256", "RS256"], jwks: jwks_loader)