Mensagem de erro
UnauthorizedError: No authorization token was found
Também aparece como
- No authorization token was found
- Format is Authorization: Bearer [token]
Sem tratamento, o Express imprime o erro com o stack trace, começando por “UnauthorizedError: No authorization token was found”. `err.code` distingue `credentials_required` (sem token) de `credentials_bad_scheme` e `credentials_bad_format` (“Format is Authorization: Bearer [token]”).
express-jwt (Node.js) — UnauthorizedError, code credentials_required
O que significa
O express-jwt protege a rota, mas não encontrou nenhum token: a requisição não tem o cabeçalho `Authorization` e nenhuma função `getToken` personalizada retornou um. Como `credentialsRequired` vale `true` por padrão, o middleware lança `UnauthorizedError` com `code: "credentials_required"` e `status: 401`, e a requisição nunca chega ao seu handler. Um cabeçalho presente, mas fora do formato `Bearer <token>`, falha com “Format is Authorization: Bearer [token]”.
Por que acontece
O cliente não enviou o cabeçalho Authorization
comumO usuário ainda não fez login, o cliente HTTP não tem o interceptador que adiciona o cabeçalho, ou o token foi apagado depois da expiração. Confira a requisição no painel de rede do navegador.
O token vai em um cookie ou na query string
comumPor padrão, o express-jwt lê apenas `Authorization: Bearer`. Tokens em um cookie HttpOnly, em um parâmetro `?access_token=` ou em um cabeçalho personalizado precisam de uma função `getToken` — e cookies também precisam do `cookie-parser`.
Um proxy removeu o cabeçalho
ocasionalGateways de API com mapeamento explícito de cabeçalhos, proxies que só repassam uma lista de cabeçalhos permitidos ou uma regra de reescrita que limpa o cabeçalho podem descartar o `Authorization` antes de a requisição chegar ao Node. O navegador mostra o cabeçalho; o servidor nunca o recebe.
O middleware também protege as rotas públicas
ocasional`app.use(expressjwt(...))` antes das rotas protege tudo, inclusive health checks, login e arquivos estáticos. As requisições para essas rotas legitimamente não trazem token.
Como corrigir
- 1.
Dizer ao express-jwt onde está o token
`getToken` recebe a requisição e retorna a string do token ou `null`. Mantenha a função simples e evite aceitar tokens de vários lugares ao mesmo tempo.
js import cookieParser from "cookie-parser"; import { expressjwt } from "express-jwt"; app.use(cookieParser()); app.use( expressjwt({ secret: getSigningKey, // e.g. jwks-rsa's expressJwtSecret(...) algorithms: ["RS256"], getToken: (req) => req.cookies.access_token ?? null, }), ); - 2.
Liberar as rotas públicas ou tornar a autenticação opcional
`.unless()` ignora os caminhos listados. `credentialsRequired: false` deixa passar requisições sem token, que chegam sem `req.auth`, para que cada rota decida.
js app.use( expressjwt({ secret, algorithms: ["HS256"] }).unless({ path: ["/health", "/login", /^\/public\//] }), ); // Or keep authentication optional and decide per route: app.use(expressjwt({ secret, algorithms: ["HS256"], credentialsRequired: false })); - 3.
Transformar o erro em um 401 adequado
O handler de erros padrão do Express usa o `status` do erro (401), mas responde com uma página HTML — com o stack trace, em desenvolvimento — e sem o cabeçalho `WWW-Authenticate`. Converta você mesmo o `UnauthorizedError` em um 401 em JSON com esse cabeçalho.
js app.use((err, req, res, next) => { if (err.name === "UnauthorizedError") { return res.status(401).set("WWW-Authenticate", "Bearer").json({ error: err.code }); } next(err); });