Saltar al contenido
ecdsa.com
express-jwt (Node.js)Bibliotecas de JWT

Mensaje de error

UnauthorizedError: No authorization token was found

También se muestra como

  • No authorization token was found
  • Format is Authorization: Bearer [token]

Si no se gestiona, Express imprime el error con su traza de pila, empezando por «UnauthorizedError: No authorization token was found». `err.code` distingue `credentials_required` (sin token) de `credentials_bad_scheme` y `credentials_bad_format` («Format is Authorization: Bearer [token]»).

express-jwt (Node.js) — UnauthorizedError, code credentials_required

Qué significa

express-jwt protege la ruta, pero no encuentra ningún token: la solicitud no tiene encabezado `Authorization` y ninguna función `getToken` personalizada devolvió uno. Como `credentialsRequired` vale `true` de forma predeterminada, el middleware lanza `UnauthorizedError` con `code: "credentials_required"` y `status: 401`, y la solicitud nunca llega a tu controlador. Un encabezado presente pero que no tiene la forma `Bearer <token>` falla, en cambio, con «Format is Authorization: Bearer [token]».

Por qué ocurre

Cómo solucionarlo

  1. 1.

    Indicar a express-jwt dónde está el token

    `getToken` recibe la solicitud y devuelve la cadena del token o `null`. Mantenla sencilla y no aceptes tokens de varios sitios a la vez.

    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.

    Excluir las rutas públicas o hacer opcional la autenticación

    `.unless()` omite las rutas indicadas. `credentialsRequired: false` deja pasar las solicitudes sin token, sin `req.auth`, para que cada ruta pueda decidir.

    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.

    Convertir el error en una respuesta 401 adecuada

    El controlador de errores predeterminado de Express usa el `status` del error (401), pero responde con una página HTML —que en desarrollo incluye la traza de pila— y sin el encabezado `WWW-Authenticate`. Convierte tú mismo `UnauthorizedError` en un 401 JSON con ese encabezado.

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

Errores relacionados

Explorar toda la base de datos de errores de firma