Introducción a OAuth 2.0 y autorización JWT en JavaScript
Las aplicaciones web modernas requieren un sistema robusto de autenticación y autorización. Los dos estándares más populares — OAuth 2.0 (protocolo de delegación de acceso) y JWT (JSON Web Tokens) — se usan a menudo juntos para crear APIs seguras. En este artículo, analizaremos cómo implementar OAuth 2.0 y autorización JWT en JavaScript (Node.js) desde cero.
Aprenderás:
- Qué es OAuth 2.0 y para qué sirve
- Cómo funcionan los tokens JWT
- Cómo configurar un servidor de autorización en Express
- Cómo proteger rutas con middleware
Fundamentos de OAuth 2.0: flujos y roles
OAuth 2.0 define cuatro roles: Resource Owner (usuario), Client (aplicación), Authorization Server (servidor que emite tokens) y Resource Server (servidor que proporciona datos). El flujo más común es Authorization Code Grant, que se utiliza en aplicaciones web.
En este artículo, nos centraremos en la implementación de un Resource Server y un Authorization Server usando JWT, en lugar de proveedores externos (Google, GitHub). Esto te dará control total sobre el proceso.
Instalación de dependencias
Para empezar, crea un nuevo proyecto Node.js e instala los paquetes necesarios:
npm init -ynpm install express jsonwebtoken bcrypt dotenv corsDescripción de los paquetes:
express— framework para crear el servidorjsonwebtoken— creación y verificación de JWTbcrypt— hashing de contraseñasdotenv— manejo de variables de entornocors— configuración de CORS para la API
Implementación de autorización JWT en Node.js
JWT es un token compacto que consta de tres partes: encabezado, payload (carga útil) y firma. Lo usaremos para autenticar usuarios después de un inicio de sesión exitoso.
Configuración del servidor y modelo de usuario
Crea un archivo server.js y define la estructura básica:
require('dotenv').config();const express = require('express');const jwt = require('jsonwebtoken');const bcrypt = require('bcrypt');const cors = require('cors');
const app = express();app.use(express.json());app.use(cors());
const PORT = process.env.PORT || 3000;const JWT_SECRET = process.env.JWT_SECRET || 'your-secret-key';
// Almacenamiento temporal de usuarios (en producción usa una BD)const users = [];Registro y hashing de contraseñas
Al registrarse, la contraseña debe ser hasheada con bcrypt:
app.post('/api/register', async (req, res) => { try { const { email, password } = req.body; // Verificar si el usuario ya existe const existingUser = users.find(u => u.email === email); if (existingUser) { return res.status(400).json({ message: 'El usuario ya existe' }); }
// Hashing de la contraseña const hashedPassword = await bcrypt.hash(password, 10); const newUser = { id: users.length + 1, email, password: hashedPassword }; users.push(newUser);
res.status(201).json({ message: 'Usuario creado' }); } catch (error) { res.status(500).json({ message: 'Error del servidor' }); }});Inicio de sesión y generación del token JWT
Después de verificar las credenciales, generamos el token con jsonwebtoken:
app.post('/api/login', async (req, res) => { try { const { email, password } = req.body; // Buscar usuario const user = users.find(u => u.email === email); if (!user) {