La autenticación es un proceso fundamental en el desarrollo de aplicaciones web y móviles, ya que permite verificar la identidad de los usuarios que intentan acceder a un sistema. En este módulo, aprenderemos los conceptos básicos de la autenticación, los diferentes métodos disponibles y cómo implementarlos en una aplicación Node.js.
Conceptos Clave
-
Autenticación vs. Autorización:
- Autenticación: Proceso de verificar la identidad de un usuario. Ejemplo: Iniciar sesión con un nombre de usuario y contraseña.
- Autorización: Proceso de determinar si un usuario autenticado tiene permiso para realizar una acción específica. Ejemplo: Acceder a una página de administración.
-
Métodos de Autenticación:
- Contraseñas: El método más común, donde los usuarios proporcionan un nombre de usuario y una contraseña.
- Tokens: Utilización de tokens (como JWT) para autenticar usuarios sin necesidad de enviar credenciales en cada solicitud.
- OAuth: Protocolo que permite a los usuarios autorizar aplicaciones de terceros para acceder a sus recursos sin compartir sus credenciales.
-
Almacenamiento Seguro de Contraseñas:
- Hashing: Transformar una contraseña en una cadena de caracteres irreversibles utilizando algoritmos como bcrypt.
- Salting: Añadir una cadena aleatoria a la contraseña antes de hashearla para proteger contra ataques de diccionario y de fuerza bruta.
Ejemplo Práctico: Autenticación Básica con Contraseñas
Paso 1: Configuración del Proyecto
Primero, crea un nuevo proyecto Node.js e instala las dependencias necesarias:
mkdir auth-example cd auth-example npm init -y npm install express bcryptjs jsonwebtoken body-parser
Paso 2: Configuración del Servidor Express
Crea un archivo server.js
y configura un servidor básico con Express:
const express = require('express'); const bodyParser = require('body-parser'); const bcrypt = require('bcryptjs'); const jwt = require('jsonwebtoken'); const app = express(); app.use(bodyParser.json()); const users = []; // Array para almacenar usuarios (en un entorno real, usar una base de datos) app.listen(3000, () => { console.log('Server running on port 3000'); });
Paso 3: Registro de Usuarios
Añade una ruta para registrar nuevos usuarios. Las contraseñas se hashean antes de almacenarse:
app.post('/register', async (req, res) => { const { username, password } = req.body; const hashedPassword = await bcrypt.hash(password, 10); users.push({ username, password: hashedPassword }); res.status(201).send('User registered'); });
Paso 4: Inicio de Sesión
Añade una ruta para que los usuarios inicien sesión. Si las credenciales son correctas, se genera un token JWT:
app.post('/login', async (req, res) => { const { username, password } = req.body; const user = users.find(u => u.username === username); if (user && await bcrypt.compare(password, user.password)) { const token = jwt.sign({ username: user.username }, 'secret_key', { expiresIn: '1h' }); res.json({ token }); } else { res.status(401).send('Invalid credentials'); } });
Paso 5: Middleware de Autenticación
Crea un middleware para proteger rutas que requieren autenticación:
const authenticate = (req, res, next) => { const token = req.header('Authorization').replace('Bearer ', ''); try { const decoded = jwt.verify(token, 'secret_key'); req.user = decoded; next(); } catch (err) { res.status(401).send('Unauthorized'); } }; app.get('/protected', authenticate, (req, res) => { res.send('This is a protected route'); });
Ejercicio Práctico
Ejercicio 1: Implementar Logout
Implementa una ruta /logout
que invalide el token JWT. (Pista: Puedes mantener una lista de tokens inválidos en memoria o en una base de datos).
Ejercicio 2: Autenticación con OAuth
Investiga e implementa la autenticación con OAuth utilizando un proveedor como Google o GitHub.
Resumen
En esta sección, hemos cubierto los conceptos básicos de la autenticación, incluyendo la diferencia entre autenticación y autorización, métodos de autenticación y almacenamiento seguro de contraseñas. También hemos implementado un ejemplo práctico de autenticación básica con contraseñas utilizando Node.js y Express. En los próximos temas, profundizaremos en técnicas más avanzadas de autenticación y autorización.
¡Continúa con el siguiente tema para aprender a usar Passport.js para la autenticación en Node.js!
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