Mensagem de erro
Invalid Compact JWS
jose (JavaScript) — JWSInvalid, code ERR_JWS_INVALID
O que significa
A biblioteca jose não conseguiu dividir a entrada nos três segmentos separados por pontos da serialização compacta do JWS (cabeçalho.payload.assinatura). A string que você passou não tem a estrutura de um token assinado; nenhuma operação criptográfica foi tentada. É o equivalente, no jose, do “jwt malformed” do jsonwebtoken — e, como aquele erro, indica que o problema está antes da biblioteca de JWT, em quem gerou ou transportou a string.
Por que acontece
O token foi truncado ou concatenado a outro
comumUm valor que perdeu o último segmento (uma coluna do banco de dados, uma linha de log, uma cópia parcial) ou dois tokens concatenados em um único cabeçalho deixam de ter exatamente três segmentos. Um prefixo “Bearer ” ou aspas JSON em volta de um token intacto não disparam esta mensagem — a string continua com três segmentos, e o jose informa, em vez disso, “JWS Protected Header is invalid”; uma quebra de linha no final é tolerada.
A variável não contém um token
comumundefined convertido na string “undefined”, uma string vazia vinda de um cookie ausente ou um token de acesso OAuth opaco (não JWT) — nenhum deles tem a estrutura de um JWS. A falha está antes do jose.
Um JWE passado para uma API de JWS
ocasionalTokens criptografados (JWE) têm cinco segmentos, não três. Se o emissor criptografa os tokens, jwtVerify/compactVerify vão rejeitá-los aqui — o ponto de entrada correto é a descriptografia (jwtDecrypt), seguida da verificação do JWS aninhado, se houver.
Como corrigir
- 1.
Limpar a entrada e conferir o número de segmentos
Remova espaços, retire o esquema e confira o número de segmentos antes de chamar o jose — assim você obtém erros precisos no nível da aplicação em vez de uma falha genérica de análise.
js const token = raw.replace(/^Bearer\s+/i, "").trim(); const segments = token.split(".").length; if (segments !== 3) throw new Error(`expected JWS (3 segments), got ${segments}`); - 2.
Encaminhar tokens JWE para a descriptografia
Se houver cinco segmentos, o token está criptografado. Use jwtDecrypt com a chave privada do destinatário em vez de jwtVerify.
js import { jwtDecrypt } from "jose"; const { payload } = await jwtDecrypt(token, privateKey); // 5-segment JWE - 3.
Rastrear onde a string foi montada
Se um valor já limpo ainda falhar, registre no log o tamanho e os primeiros caracteres dele em cada etapa — cliente, gateway, armazenamento, handler. O primeiro segmento de um JWT assinado é JSON em base64url, então tokens reais começam com “eyJ” (a codificação de '{"'); a etapa em que isso deixa de ser verdade é onde a corrupção acontece.
js console.log(token.length, JSON.stringify(token.slice(0, 12))); // healthy: 300+ 'eyJhbGciOiJF'