Mensagem de erro
Wrong number of segments
Também aparece como
- UnexpectedValueException: Wrong number of segments
- Unexpected control character found
Ao ser impressa, a mensagem vem prefixada com o nome da classe: “UnexpectedValueException: Wrong number of segments”. O caso do prefixo `Bearer` produz, em vez disso, “Unexpected control character found” (uma `DomainException`).
firebase/php-jwt (PHP) — UnexpectedValueException from JWT::decode
O que significa
`JWT::decode` dividiu a entrada nos pontos e não obteve exatamente três partes; portanto, não é um JWS compacto, e nada mais foi verificado. Em aplicações PHP, a origem mais comum é uma string vazia: o servidor web não repassou o cabeçalho `Authorization` ao PHP, e o código caiu no valor padrão `''`. Um token que ainda traz o prefixo `Bearer ` tem três segmentos, mas falha uma etapa depois, normalmente com “Unexpected control character found” do decodificador JSON.
Por que acontece
O cabeçalho Authorization nunca chegou ao PHP
comumO Apache com PHP-FPM ou CGI remove o `Authorization`, a menos que seja configurado para repassá-lo, e alguns painéis de hospedagem fazem o mesmo. O cliente envia o cabeçalho; `$_SERVER['HTTP_AUTHORIZATION']` não está definido.
O valor não é um JWT
comumUm ID de sessão, um token de acesso OAuth opaco, uma chave de API ou `"null"` enviado por um cliente JavaScript que ainda não tinha token.
Esquema ou aspas que ficaram na string
ocasionalPassar o valor inteiro do cabeçalho, ou um token codificado em JSON com aspas, quebra o parsing do primeiro segmento.
Como corrigir
- 1.
Ler o cabeçalho de forma robusta e validar o formato
Procure o cabeçalho nos lugares em que as diferentes configurações de servidor o colocam, aceite somente `Bearer <three base64url segments>` e responda 401 nos demais casos.
php function bearerToken(): ?string { $header = $_SERVER['HTTP_AUTHORIZATION'] ?? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] // Apache + mod_rewrite ?? (function_exists('apache_request_headers') ? (apache_request_headers()['Authorization'] ?? '') : ''); if (!preg_match('/^Bearer\s+([A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]*)$/', $header, $m)) { return null; } return $m[1]; } - 2.
Fazer o Apache repassar o cabeçalho
`CGIPassAuth On` (Apache 2.4.13+) ou uma regra de reescrita expõe o `Authorization` ao PHP.
text # Apache with PHP-FPM / CGI: pass the Authorization header through CGIPassAuth On # or, with mod_rewrite: RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]