Pular para o conteúdo
ecdsa.com
firebase/php-jwt (PHP)PHP

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

Como corrigir

  1. 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. 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}]

Erros relacionados

Ver toda a base de erros de assinatura