Pular para o conteúdo
ecdsa.com
express-jwt (Node.js)Bibliotecas de JWT

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

Como corrigir

  1. 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. 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. 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);
    });

Erros relacionados

Ver toda a base de erros de assinatura