Saltar al contenido
ecdsa.com
ruby-jwt (Ruby)Ruby

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

Cómo solucionarlo

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

Errores relacionados

Explorar toda la base de datos de errores de firma