Mensaje de error
Not enough or too many segments
También se muestra como
- Not enough or too many segments (JWT::DecodeError)
- Invalid base64 encoding (JWT::Base64DecodeError)
ruby-jwt 2.x lanzaba `JWT::DecodeError` con el mismo texto. Con el prefijo `Bearer`, el error es «Invalid base64 encoding (JWT::Base64DecodeError)».
ruby-jwt (Ruby) — JWT::DecodeError (JWT::MalformedTokenError in 3.x) from JWT.decode
Qué significa
ruby-jwt dividió la entrada por los puntos y no encontró los tres segmentos de un JWT firmado, así que no se comprobó nada más. En ruby-jwt 3.x la clase es `JWT::MalformedTokenError` (un `JWT::TokenError`, que a su vez es un `JWT::DecodeError`), de modo que los bloques `rescue JWT::DecodeError` existentes siguen capturando este error. Un token que aún conserva el prefijo `Bearer ` sí se divide en tres partes, pero falla en la primera con «Invalid base64 encoding» en lugar de este error.
Por qué ocurre
Un valor vacío o que no es un JWT
frecuenteUn encabezado ausente que `to_s` convirtió en `""`, una cookie de sesión o un token de acceso OAuth opaco que nunca fue un JWT.
Se decodificó el encabezado Authorization completo
frecuente`request.headers["Authorization"]` devuelve `Bearer eyJ…`. Quita el esquema antes de decodificar.
Un token cifrado
rara`JWT.decode` no admite los tokens JWE de cinco segmentos; primero hay que descifrarlos con una biblioteca de JWE.
Cómo solucionarlo
- 1.
Extraer primero el token y comprobar su forma
Acepta solo `Bearer <header.payload.signature>` y responde con 401 a todo lo demás, antes de que llegue a ruby-jwt.
ruby def bearer_token(request) scheme, token = request.authorization.to_s.split(" ", 2) return nil unless scheme&.casecmp?("Bearer") && token&.count(".") == 2 token end token = bearer_token(request) or return head(:unauthorized) payload, _header = JWT.decode(token, public_key, true, algorithm: "ES256")