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
Um valor vazio ou que não é um JWT
comumUm cabeçalho ausente que o `to_s` transformou em `""`, um cookie de sessão ou um token de acesso OAuth opaco que nunca foi um JWT.
O cabeçalho Authorization foi decodificado inteiro
comum`request.headers["Authorization"]` retorna `Bearer eyJ…`. Remova o esquema antes da decodificação.
Um token criptografado
raraO `JWT.decode` não aceita tokens JWE de cinco segmentos; eles precisam ser descriptografados antes com uma biblioteca de JWE.
Como corrigir
- 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")