Introducción: por qué OAuth 2.0 y JWT son el estándar de la autorización moderna
En el desarrollo web moderno, la autenticación y autorización segura de usuarios es una de las tareas clave. Los dos protocolos y formatos más populares que resuelven esta tarea son OAuth 2.0 y JWT (JSON Web Token). Aunque a menudo se usan juntos, son cosas diferentes: OAuth 2.0 es un protocolo de delegación de acceso, mientras que JWT es un formato de token.
En este artículo, analizaremos cómo funciona OAuth 2.0, qué es JWT y cómo implementarlos en JavaScript (Node.js). El material está orientado a desarrolladores principiantes, por lo que avanzaremos desde la teoría a la práctica con ejemplos de código claros.
¿Qué es OAuth 2.0 y cómo funciona?
OAuth 2.0 (Open Authorization) es un protocolo que permite a una aplicación obtener acceso limitado a los recursos de un usuario sin transferir su nombre de usuario y contraseña. Imagine que quiere iniciar sesión en un sitio web a través de Google o GitHub; eso es OAuth 2.0.
Roles principales en OAuth 2.0
- Resource Owner — el usuario propietario de los datos
- Client — la aplicación que solicita acceso
- Authorization Server — el servidor que emite tokens (por ejemplo, Google)
- Resource Server — el servidor que almacena los datos del usuario
Flujo Authorization Code Grant (ejemplo con Node.js)
El flujo más común y seguro de OAuth 2.0 es Authorization Code Grant. Veamos su implementación usando Express.js.
// Instalación de dependencias// npm install express axios dotenv
// .envCLIENT_ID=your_client_idCLIENT_SECRET=your_client_secretREDIRECT_URI=http://localhost:3000/callbackconst express = require('express');const axios = require('axios');require('dotenv').config();
const app = express();
// Paso 1: Redirigir al usuario a la página de autorizaciónapp.get('/auth', (req, res) => { const authUrl = `https://provider.com/oauth/authorize?client_id=${process.env.CLIENT_ID}&redirect_uri=${process.env.REDIRECT_URI}&response_type=code&scope=email`; res.redirect(authUrl);});
// Paso 2: Manejar el callback con el authorization codeapp.get('/callback', async (req, res) => { const { code } = req.query;
try { // Intercambiar authorization code por access token const tokenResponse = await axios.post('https://provider.com/oauth/token', { client_id: process.env.CLIENT_ID, client_secret: process.env.CLIENT_SECRET, code, redirect_uri: process.env.REDIRECT_URI, grant_type: 'authorization_code' });
const { access_token, refresh_token } = tokenResponse.data; // Guardar los tokens (en un proyecto real, en la BD) req.session.accessToken = access_token; req.session.refreshToken = refresh_token;
res.send('¡Autorización exitosa!'); } catch (error) { res.status(500).send('Error de autorización'); }});
app.listen(3000, () => console.log('Servidor iniciado en el puerto 3000'));JWT (JSON Web Token): estructura y creación
JWT es una forma compacta y autónoma de transmitir información entre partes como un objeto JSON. El token consta de tres partes separadas por puntos:
- Header — tipo de token y algoritmo de firma (por ejemplo, HS256)
- Payload — datos (claims) que queremos transmitir
- Signature — firma que garantiza la integridad de los datos
Creación de JWT en Node.js
Para trabajar con JWT usaremos la librería jsonwebtoken.
// npm install jsonwebtoken
const jwt = require('jsonwebtoken');
const secretKey = 'su_secreto