Mensagem de erro
jwt must be provided
jsonwebtoken (Node.js) — JsonWebTokenError from jwt.verify()
O que significa
`jwt.verify()` não recebeu token nenhum: o primeiro argumento era `undefined`, `null` ou uma string vazia. O jsonwebtoken confere isso antes de analisar o token, então nem a chave nem o formato do token importam ainda. O problema está em uma etapa anterior — o código que extrai o token da requisição não encontrou nada.
Por que acontece
O cliente não enviou um cabeçalho Authorization
comumA requisição chegou à rota sem token — o usuário não tinha feito login, o cliente esqueceu de anexar o cabeçalho ou o token expirou no lado do cliente e foi apagado. Nesse caso, um código como `req.headers.authorization.split(" ")[1]` retorna `undefined`.
O token é lido do lugar errado
comumPropriedades com grafia errada (`authorisation`, `Authorization` em um mapa de cabeçalhos com nomes em minúsculas), um cabeçalho personalizado como `x-access-token` ou um parâmetro da query string que o código não lê. O Node converte para minúsculas os nomes dos cabeçalhos recebidos, então `req.headers.Authorization` é sempre `undefined`.
O cookie de sessão não foi enviado
ocasionalRequisições entre origens omitem cookies, a menos que o cliente defina `credentials: "include"` e o cookie seja `SameSite=None; Secure`. Sem o middleware cookie-parser, `req.cookies` também fica vazio.
O token ainda não estava pronto
ocasionalFront-ends que buscam dados antes de o fluxo de login armazenar o token, ou que leem o token do armazenamento de forma assíncrona, enviam as primeiras requisições com um valor vazio.
Como corrigir
- 1.
Extrair o token de forma defensiva e responder 401
Verifique se o token está ausente antes de chamar `verify` e retorne 401 com um cabeçalho `WWW-Authenticate: Bearer`. Assim, os clientes veem “não autenticado” em vez de um 500 causado por um erro não capturado.
js function bearerToken(req) { const [scheme, token] = (req.headers.authorization ?? "").split(" "); return scheme?.toLowerCase() === "bearer" && token ? token : null; } app.use((req, res, next) => { const token = bearerToken(req); if (!token) return res.status(401).set("WWW-Authenticate", "Bearer").end(); try { req.user = jwt.verify(token, publicKey, { algorithms: ["ES256"] }); next(); } catch { res.status(401).set("WWW-Authenticate", 'Bearer error="invalid_token"').end(); } }); - 2.
Fazer o cliente anexar o token
Confirme no painel de rede do navegador que a requisição traz `Authorization: Bearer …` (ou o cookie). Se o cabeçalho aparece no navegador, mas falta no servidor, um proxy no meio do caminho o remove.
js // Browser / Node 18+ fetch: the token must be attached explicitly. await fetch("https://api.example.com/orders", { headers: { Authorization: "Bearer " + accessToken }, }); // Cookies cross origins only with credentials and SameSite=None; Secure. await fetch("https://api.example.com/orders", { credentials: "include" });