Passport.js es un middleware de autenticación para Node.js que facilita la integración de diversas estrategias de autenticación en aplicaciones web. En este módulo, aprenderemos cómo configurar y utilizar Passport.js para autenticar usuarios en una aplicación Node.js.

Contenido

Introducción a Passport.js

Passport.js es un middleware flexible y modular que se puede integrar fácilmente en cualquier aplicación Node.js. Soporta más de 500 estrategias de autenticación, incluyendo autenticación local, OAuth, OpenID, y muchas más.

Características Clave

  • Modularidad: Passport.js permite agregar múltiples estrategias de autenticación.
  • Simplicidad: La configuración y uso de Passport.js es sencillo y directo.
  • Flexibilidad: Se puede personalizar según las necesidades de la aplicación.

Instalación de Passport.js y Estrategias

Para comenzar, necesitamos instalar Passport.js y la estrategia de autenticación que vamos a utilizar. En este ejemplo, usaremos la estrategia de autenticación local.

npm install passport passport-local

Configuración de Passport.js

  1. Configuración Básica

Primero, necesitamos configurar Passport.js en nuestra aplicación Express. Crearemos un archivo passport-config.js para manejar la configuración de Passport.

// passport-config.js
const passport = require('passport');
const LocalStrategy = require('passport-local').Strategy;
const bcrypt = require('bcrypt');

// Simulación de base de datos de usuarios
const users = [
  { id: 1, username: 'user1', password: '$2b$10$EixZaYVK1fsbw1ZfbX3OXePaWxn96p36Zf4d6Z6Q5e6Q5e6Q5e6Q5e' } // password: 'password123'
];

passport.use(new LocalStrategy(
  function(username, password, done) {
    const user = users.find(user => user.username === username);
    if (!user) {
      return done(null, false, { message: 'Incorrect username.' });
    }
    bcrypt.compare(password, user.password, function(err, res) {
      if (res) {
        return done(null, user);
      } else {
        return done(null, false, { message: 'Incorrect password.' });
      }
    });
  }
));

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  const user = users.find(user => user.id === id);
  done(null, user);
});

  1. Integración con Express

Ahora, integramos Passport.js en nuestra aplicación Express.

// app.js
const express = require('express');
const passport = require('passport');
const session = require('express-session');
require('./passport-config');

const app = express();

app.use(express.urlencoded({ extended: false }));
app.use(session({
  secret: 'secret',
  resave: false,
  saveUninitialized: false
}));
app.use(passport.initialize());
app.use(passport.session());

app.post('/login', passport.authenticate('local', {
  successRedirect: '/dashboard',
  failureRedirect: '/login',
  failureFlash: true
}));

app.get('/dashboard', (req, res) => {
  if (req.isAuthenticated()) {
    res.send('Welcome to the dashboard!');
  } else {
    res.redirect('/login');
  }
});

app.listen(3000, () => {
  console.log('Server started on http://localhost:3000');
});

Implementación de Estrategias de Autenticación

En este ejemplo, hemos implementado la estrategia de autenticación local. Passport.js también soporta otras estrategias como OAuth y OpenID, que se pueden integrar de manera similar.

Estrategia Local

La estrategia local autentica a los usuarios mediante un nombre de usuario y una contraseña. En el archivo passport-config.js, hemos configurado la estrategia local para buscar el usuario en una base de datos simulada y comparar la contraseña proporcionada con la almacenada.

Protección de Rutas

Para proteger rutas específicas, podemos usar el método req.isAuthenticated() para verificar si el usuario está autenticado.

app.get('/dashboard', (req, res) => {
  if (req.isAuthenticated()) {
    res.send('Welcome to the dashboard!');
  } else {
    res.redirect('/login');
  }
});

Ejercicio Práctico

Ejercicio 1: Implementar Registro de Usuarios

  1. Objetivo: Implementar una ruta de registro de usuarios que permita a los nuevos usuarios registrarse en la aplicación.
  2. Instrucciones:
    • Crear una ruta /register que muestre un formulario de registro.
    • Crear una ruta POST /register que maneje el registro de usuarios.
    • Almacenar los nuevos usuarios en la base de datos simulada.

Solución

// app.js (continuación)
const bcrypt = require('bcrypt');

app.get('/register', (req, res) => {
  res.send('<form action="/register" method="post"><input type="text" name="username"/><input type="password" name="password"/><button type="submit">Register</button></form>');
});

app.post('/register', async (req, res) => {
  const { username, password } = req.body;
  const hashedPassword = await bcrypt.hash(password, 10);
  users.push({ id: users.length + 1, username, password: hashedPassword });
  res.redirect('/login');
});

Conclusión

En esta sección, hemos aprendido cómo configurar y utilizar Passport.js para autenticar usuarios en una aplicación Node.js. Hemos cubierto la instalación, configuración y protección de rutas, así como la implementación de una estrategia de autenticación local. Además, hemos realizado un ejercicio práctico para reforzar los conceptos aprendidos.

En el siguiente módulo, exploraremos la autenticación JWT, que es otra forma popular de autenticar usuarios en aplicaciones web modernas.

Curso de Node.js

Módulo 1: Introducción a Node.js

Módulo 2: Conceptos Básicos

Módulo 3: Sistema de Archivos y E/S

Módulo 4: HTTP y Servidores Web

Módulo 5: NPM y Gestión de Paquetes

Módulo 6: Framework Express.js

Módulo 7: Bases de Datos y ORMs

Módulo 8: Autenticación y Autorización

Módulo 9: Pruebas y Depuración

Módulo 10: Temas Avanzados

Módulo 11: Despliegue y DevOps

Módulo 12: Proyectos del Mundo Real

© Copyright 2024. Todos los derechos reservados