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.
Configuración de Passport.js
- 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); });
- 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
- Objetivo: Implementar una ruta de registro de usuarios que permita a los nuevos usuarios registrarse en la aplicación.
- 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.
- Crear una ruta
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
- Creando un Servidor HTTP Simple
- Manejo de Solicitudes y Respuestas
- Sirviendo Archivos Estáticos
- Enrutamiento
Módulo 5: NPM y Gestión de Paquetes
- Introducción a NPM
- Instalación y Uso de Paquetes
- Creación y Publicación de Paquetes
- Versionado Semántico
Módulo 6: Framework Express.js
- Introducción a Express.js
- Configuración de una Aplicación Express
- Middleware
- Enrutamiento en Express
- Manejo de Errores
Módulo 7: Bases de Datos y ORMs
- Introducción a las Bases de Datos
- Usando MongoDB con Mongoose
- Usando Bases de Datos SQL con Sequelize
- Operaciones CRUD
Módulo 8: Autenticación y Autorización
- Introducción a la Autenticación
- Usando Passport.js
- Autenticación JWT
- Control de Acceso Basado en Roles
Módulo 9: Pruebas y Depuración
- Introducción a las Pruebas
- Pruebas Unitarias con Mocha y Chai
- Pruebas de Integración
- Depuración de Aplicaciones Node.js
Módulo 10: Temas Avanzados
- Módulo Cluster
- Hilos de Trabajo
- Optimización del Rendimiento
- Construcción de APIs RESTful
- GraphQL con Node.js
Módulo 11: Despliegue y DevOps
- Variables de Entorno
- Usando PM2 para la Gestión de Procesos
- Desplegando en Heroku
- Integración y Despliegue Continuos