Pular para o conteúdo
ecdsa.com
ruby-jwt (Ruby)Ruby

Mensagem de erro

Not enough or too many segments

Também aparece como

  • Not enough or too many segments (JWT::DecodeError)
  • Invalid base64 encoding (JWT::Base64DecodeError)

O ruby-jwt 2.x lançava `JWT::DecodeError` com o mesmo texto. O caso do prefixo `Bearer` gera “Invalid base64 encoding (JWT::Base64DecodeError)”.

ruby-jwt (Ruby) — JWT::DecodeError (JWT::MalformedTokenError in 3.x) from JWT.decode

O que significa

O ruby-jwt dividiu a entrada nos pontos e não encontrou os três segmentos de um JWT assinado, por isso nada mais foi verificado. No ruby-jwt 3.x, a classe é `JWT::MalformedTokenError` (uma `JWT::TokenError`, que por sua vez é uma `JWT::DecodeError`), então os blocos `rescue JWT::DecodeError` existentes continuam capturando esse erro. Um token que ainda traz o prefixo `Bearer ` se divide em três partes, mas, em vez disso, falha já na primeira, com “Invalid base64 encoding”.

Por que acontece

Como corrigir

  1. 1.

    Extrair o token e conferir o formato primeiro

    Aceite apenas `Bearer <header.payload.signature>` e responda com 401 a qualquer outra coisa, antes que o valor chegue ao 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")

Erros relacionados

Ver toda a base de erros de assinatura