Autenticación con Node.js Express: Conceptos, Métodos y Ejemplos

La autenticación es clave para proteger apps web, asegurando que los usuarios accedan solo a recursos autorizados. En Node.js, Express simplifica su implementación.

Daniel Costa

Daniel Costa

15 April 2025

Autenticación con Node.js Express: Conceptos, Métodos y Ejemplos

Autenticación es un aspecto fundamental para asegurar las aplicaciones web, garantizando que los usuarios puedan acceder solo a los recursos y datos a los que están autorizados. En el ecosistema de Node.js, Express es un framework popular que simplifica la implementación de la autenticación. Este blog cubrirá los conceptos clave de autenticación, los métodos comunes utilizados en las aplicaciones de Node.js y Express, y proporcionará ejemplos prácticos para ayudarte a empezar.

Introducción a la autenticación de Node.js Express

La autenticación de Node.js Express se refiere a los métodos y prácticas utilizados para verificar la identidad de los usuarios que acceden a una aplicación de Node.js construida con el framework Express. La autenticación asegura que solo los usuarios autorizados puedan acceder a ciertos recursos, proporcionando seguridad y protegiendo los datos sensibles.

💡
Apidog no es solo una potente plataforma de desarrollo y prueba de APIs; también proporciona un amplio soporte para el manejo de la autorización. Esta capacidad es crucial para asegurar que las APIs sean seguras y accesibles solo para los usuarios autorizados.
button

Autenticación vs. Autorización

Autenticación sin estado vs. con estado

Métodos comunes de autenticación de Node.js Express

1. Autenticación básica

2. Autenticación basada en tokens (JWT)

3. Autenticación basada en sesiones

4. OAuth2

5. Inicio de sesión social

6. Autenticación multifactor (MFA)

7. Autenticación con clave de API

8. Autenticación LDAP

9. Autenticación SAML

¿Cómo elegir los métodos de autenticación de Node.js Express correctos?

Elegir el método de autenticación correcto para tu aplicación de Node.js Express depende de varios factores, incluyendo los requisitos de seguridad, la experiencia del usuario y los casos de uso específicos de tu aplicación. Aquí tienes una guía sobre cuándo usar cada método de autenticación:

1. Autenticación básica

Cuándo usar:

Pros:

Contras:

2. Autenticación basada en tokens (JWT)

Cuándo usar:

Pros:

Contras:

3. Autenticación basada en sesiones

Cuándo usar:

Pros:

Contras:

4. OAuth2

Cuándo usar:

Pros:

Contras:

5. Inicio de sesión social

Cuándo usar:

Pros:

Contras:

6. Autenticación multifactor (MFA)

Cuándo usar:

Pros:

Contras:

7. Autenticación con clave de API

Cuándo usar:

Pros:

Contras:

8. Autenticación LDAP

Cuándo usar:

Pros:

Contras:

9. Autenticación SAML

Cuándo usar:

Pros:

Contras:

Un breve resumen de la elección de métodos de autenticación

Elegir el método de autenticación correcto para tu aplicación de Node.js Express implica comprender las diferentes opciones disponibles y evaluarlas según los requisitos específicos de tu aplicación.

Autenticación básica: Rápida y simple para aplicaciones no críticas.

Autenticación basada en tokens (JWT): Ideal para SPAs, aplicaciones móviles y microservicios.

Autenticación basada en sesiones: Adecuada para aplicaciones web tradicionales.

OAuth2: Mejor para integraciones de terceros y acceso delegado.

Inicio de sesión social: Genial para aplicaciones orientadas al consumidor para mejorar la experiencia del usuario.

Autenticación multifactor (MFA): Esencial para aplicaciones de alta seguridad.

Autenticación con clave de API: Útil para la comunicación de servicio a servicio y APIs públicas.

Autenticación LDAP: Apta para aplicaciones empresariales con gestión de usuarios centralizada.

Autenticación SAML: Se utiliza para SSO empresarial y sistemas de identidad federada.

Elegir el método correcto depende de las necesidades específicas de tu aplicación, los requisitos de seguridad y las consideraciones de la experiencia del usuario.

Ejemplos de autenticación de Node.js Express

La autenticación es una parte crítica de cualquier aplicación web, asegurando que los usuarios puedan acceder de forma segura a los recursos. Exploremos varios ejemplos de cómo implementar la autenticación en una aplicación de Node.js Express. Cubriremos algunos de los métodos más comunes: JWT (JSON Web Tokens), autenticación basada en sesiones, OAuth2 y claves de API.

1. Autenticación JWT (JSON Web Tokens)

JWT es un método de autenticación sin estado que te permite transmitir de forma segura información entre partes como un objeto JSON. Esta información puede ser verificada y confiable porque está firmada digitalmente.

Pasos de implementación:

Paso 1: Configura tu proyecto

Primero, crea un nuevo proyecto e instala las dependencias necesarias:

mkdir jwt-auth-example
cd jwt-auth-example
npm init -y
npm install express jsonwebtoken body-parser bcryptjs

Paso 2: Crea el servidor Express

Crea un archivo app.js y configura un servidor Express básico:

const express = require('express');
const jwt = require('jsonwebtoken');
const bodyParser = require('body-parser');
const bcrypt = require('bcryptjs');

const app = express();
app.use(bodyParser.json());

const SECRET_KEY = 'your_jwt_secret';

// Mock User Data
const users = [{ id: 1, username: 'user1', password: bcrypt.hashSync('password1', 8) }];

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const user = users.find(u => u.username === username);
  if (user && bcrypt.compareSync(password, user.password)) {
    const token = jwt.sign({ id: user.id, username: user.username }, SECRET_KEY, { expiresIn: '1h' });
    res.json({ token });
  } else {
    res.status(401).send('Invalid credentials');
  }
});

const authenticateJWT = (req, res, next) => {
  const token = req.headers.authorization;
  if (token) {
    jwt.verify(token, SECRET_KEY, (err, user) => {
      if (err) {
        return res.sendStatus(403);
      }
      req.user = user;
      next();
    });
  } else {
    res.sendStatus(401);
  }
};

app.get('/protected', authenticateJWT, (req, res) => {
  res.send(`Hello ${req.user.username}, you have accessed a protected route!`);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

2. Autenticación basada en sesiones

La autenticación basada en sesiones se basa en el almacenamiento de datos de sesión en el lado del servidor. Este método tiene estado y se utiliza comúnmente en aplicaciones web tradicionales.

Pasos de implementación:

Paso 1: Configura tu proyecto

Crea un nuevo proyecto e instala las dependencias necesarias:

mkdir session-auth-example
cd session-auth-example
npm init -y
npm install express express-session body-parser bcryptjs

Paso 2: Crea el servidor Express

Crea un archivo app.js y configura un servidor Express básico:

const express = require('express');
const session = require('express-session');
const bodyParser = require('body-parser');
const bcrypt = require('bcryptjs');

const app = express();
app.use(bodyParser.json());
app.use(session({ secret: 'your_session_secret', resave: false, saveUninitialized: true }));

const users = [{ id: 1, username: 'user1', password: bcrypt.hashSync('password1', 8) }];

app.post('/login', (req, res) => {
  const { username, password } = req.body;
  const user = users.find(u => u.username === username);
  if (user && bcrypt.compareSync(password, user.password)) {
    req.session.userId = user.id;
    res.send('Logged in');
  } else {
    res.status(401).send('Invalid credentials');
  }
});

const authenticateSession = (req, res, next) => {
  if (req.session.userId) {
    next();
  } else {
    res.sendStatus(401);
  }
};

app.get('/protected', authenticateSession, (req, res) => {
  const user = users.find(u => u.id === req.session.userId);
  res.send(`Hello ${user.username}, you have accessed a protected route!`);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

3. Autenticación OAuth2

OAuth2 es un método de autenticación más complejo que permite a las aplicaciones de terceros acceder a los recursos del usuario sin exponer las credenciales del usuario. Se utiliza comúnmente para el inicio de sesión social y la integración con otros servicios.

Pasos de implementación:

La implementación de OAuth2 generalmente implica el uso de una biblioteca o framework que maneje el flujo de OAuth2. Para simplificar, usaremos la biblioteca passport con una estrategia como passport-google-oauth20.

Paso 1: Configura tu proyecto

Crea un nuevo proyecto e instala las dependencias necesarias:

mkdir oauth2-auth-example
cd oauth2-auth-example
npm init -y
npm install express passport passport-google-oauth20 express-session

Paso 2: Crea el servidor Express

Crea un archivo app.js y configura un servidor Express básico:

const express = require('express');
const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const session = require('express-session');

const app = express();

app.use(session({ secret: 'your_session_secret', resave: false, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());

passport.use(new GoogleStrategy({
  clientID: 'YOUR_GOOGLE_CLIENT_ID',
  clientSecret: 'YOUR_GOOGLE_CLIENT_SECRET',
  callbackURL: 'http://localhost:3000/auth/google/callback'
}, (accessToken, refreshToken, profile, done) => {
  // In a real application, you would save the profile info to your database
  return done(null, profile);
}));

passport.serializeUser((user, done) => {
  done(null, user);
});

passport.deserializeUser((obj, done) => {
  done(null, obj);
});

app.get('/auth/google', passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/plus.login'] }));

app.get('/auth/google/callback', passport.authenticate('google', { failureRedirect: '/' }), (req, res) => {
  res.redirect('/protected');
});

const ensureAuthenticated = (req, res, next) => {
  if (req.isAuthenticated()) {
    return next();
  }
  res.redirect('/');
};

app.get('/protected', ensureAuthenticated, (req, res) => {
  res.send(`Hello ${req.user.displayName}, you have accessed a protected route!`);
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

4. Autenticación con clave de API

La autenticación con clave de API es simple y se utiliza a menudo para la comunicación de servidor a servidor. Implica pasar una clave con cada solicitud para verificar el cliente.

Pasos de implementación

Paso 1: Configura tu proyecto

Crea un nuevo proyecto e instala las dependencias necesarias:

mkdir api-key-auth-example
cd api-key-auth-example
npm init -y
npm install express

Paso 2: Crea el servidor Express

Crea un archivo app.js y configura un servidor Express básico:

const express = require('express');
const app = express();

const API_KEY = 'your_api_key';

const authenticateApiKey = (req, res, next) => {
  const apiKey = req.headers['x-api-key'];
  if (apiKey && apiKey === API_KEY) {
    next();
  } else {
    res.sendStatus(401);
  }
};

app.get('/protected', authenticateApiKey, (req, res) => {
  res.send('Access granted to protected route');
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server is running on port ${PORT}`);
});

Desde la autenticación JWT sin estado hasta la autenticación tradicional basada en sesiones y OAuth2 para integraciones de terceros, tienes una variedad de métodos para elegir según los requisitos de tu aplicación. Comprender e implementar correctamente estos métodos te ayudará a construir aplicaciones seguras y escalables.

10 Mejores prácticas para la autenticación de Node.js Express

La implementación de la autenticación en una aplicación de Node.js Express requiere una cuidadosa consideración para garantizar la seguridad, la escalabilidad y la facilidad de uso. Aquí hay algunas mejores prácticas a seguir al manejar la autenticación en tus aplicaciones de Node.js Express:

1. Utiliza un hash de contraseña fuerte

const bcrypt = require('bcryptjs');

const hashPassword = async (password) => {
    const salt = await bcrypt.genSalt(10);
    return await bcrypt.hash(password, salt);
};

2. Asegura los tokens JWT

const jwt = require('jsonwebtoken');
const SECRET_KEY = process.env.SECRET_KEY;

const token = jwt.sign({ userId: user.id }, SECRET_KEY, { expiresIn: '1h' });

3. Utiliza HTTPS

4. Valida la entrada

const { body, validationResult } = require('express-validator');

app.post('/register', [
    body('email').isEmail(),
    body('password').isLength({ min: 6 })
], (req, res) => {
    const errors = validationResult(req);
    if (!errors.isEmpty()) {
        return res.status(400).json({ errors: errors.array() });
    }
    // Proceed with registration
});

5. Implementa la limitación de velocidad

const rateLimit = require('express-rate-limit');

const limiter = rateLimit({
    windowMs: 15 * 60 * 1000, // 15 minutos
    max: 100 // limit each IP to 100 requests per windowMs
});

app.use('/login', limiter);

6. Almacena los tokens de forma segura

7. Implementa una gestión de sesiones adecuada

8. Utiliza middleware para rutas protegidas

const authenticateJWT = (req, res, next) => {
    const token = req.headers.authorization;

    if (!token) {
        return res.sendStatus(401);
    }

    jwt.verify(token, SECRET_KEY, (err, user) => {
        if (err) {
            return res.sendStatus(403);
        }

        req.user = user;
        next();
    });
};

app.get('/protected', authenticateJWT, (req, res) => {
    res.send('This is a protected route');
});

9. Supervisa y registra los eventos de autenticación

10. Actualiza regularmente las dependencias

Aprovechando Apidog para probar APIs con métodos de autenticación Node.js Express

Apidog es una plataforma integral de desarrollo de APIs que agiliza todo el proceso de desarrollo. Cuenta con robustas opciones de autenticación integradas, lo que permite a los desarrolladores probar los endpoints de la API con varios métodos, incluyendo Clave de API, Token de portador, JWT, Autenticación básica, Autenticación Digest, OAuth 1.0, OAuth 2.0, Autenticación Hawk, NTLM y Akamai EdgeGrid. Esto permite a los desarrolladores de APIs validar a fondo las estrategias de autenticación implementadas en sus APIs.

auth methods for APIs

Conclusión

La implementación de la autenticación en una aplicación de Node.js Express es crucial para garantizar la seguridad y la integridad de tu aplicación web. Al comprender los diversos métodos de autenticación, desde la autenticación básica y JWT hasta OAuth2 y LDAP, y seguir las mejores prácticas como el uso de un hash de contraseña fuerte, la protección de los tokens JWT y la validación de la entrada, puedes crear sistemas de autenticación robustos y seguros. Herramientas como Apidog mejoran aún más tu capacidad para probar y validar estos métodos de autenticación, asegurando que funcionen según lo previsto. Al elegir e implementar cuidadosamente la estrategia de autenticación adecuada para las necesidades de tu aplicación, puedes proporcionar una experiencia de usuario segura y fluida, protegiendo los datos y recursos sensibles de manera efectiva.

Explore more

Cómo usar Ollama: Guía Completa para Principiantes sobre LLMs Locales con Ollama

Cómo usar Ollama: Guía Completa para Principiantes sobre LLMs Locales con Ollama

El panorama de la inteligencia artificial evoluciona constantemente, y los Grandes Modelos de Lenguaje (LLM) se vuelven cada vez más potentes y accesibles. Aunque muchos interactúan con estos modelos a través de servicios basados en la nube, existe un movimiento creciente enfocado en ejecutarlos directamente en computadoras personales. Aquí es donde entra Ollama. Ollama es una herramienta potente pero fácil de usar, diseñada para simplificar drásticamente el complejo proceso de descargar, config

28 April 2025

¿Dónde Descargar Swagger UI en Español Gratis?

¿Dónde Descargar Swagger UI en Español Gratis?

¿Necesitas Swagger UI en español? Este artículo explica por qué no existe una descarga oficial gratuita y cómo habilitar la traducción. Explora las características de Swagger y por qué Apidog es la alternativa superior para diseño, pruebas y documentación API integrados.

23 April 2025

¿Dónde Descargar Postman en Español Gratis?

¿Dónde Descargar Postman en Español Gratis?

¿Puedes descargar Postman en español gratis? Aunque Postman carece de soporte nativo en español, existen soluciones. Explóralas y descubre Apidog, una potente alternativa unificada a Postman diseñada para optimizar todo tu flujo de trabajo de API, sin importar el idioma.

22 April 2025

Practica el diseño de API en Apidog

Descubre una forma más fácil de construir y usar APIs