OAuth 2.0 y autorización JWT en JavaScript: guía completa para principiantes

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Introducción a OAuth 2.0 y JWT: ¿qué son y para qué sirven?

\n

Las aplicaciones web modernas rara vez prescinden de un sistema de autorización. Ya sea iniciar sesión con Google, acceder a una API o proteger rutas en su aplicación Node.js, necesitará OAuth 2.0 y JWT (JSON Web Tokens). Estas tecnologías se han convertido en el estándar de facto para el intercambio seguro de datos entre cliente y servidor.

\n

En este artículo, analizaremos cómo funcionan OAuth 2.0 y JWT, y crearemos un sistema de autorización simple en JavaScript (Node.js). El material está dirigido a desarrolladores principiantes, por lo que pasaremos de la teoría a la práctica con ejemplos de código detallados.

\n\n

Parte 1: ¿Qué es OAuth 2.0 y cómo funciona?

\n

OAuth 2.0 es un protocolo de autorización que permite a las aplicaciones obtener acceso limitado a los recursos del usuario sin compartir la contraseña. Imagine que quiere iniciar sesión en un sitio web con su cuenta de Google. OAuth 2.0 es el encargado de este proceso.

\n

Roles principales en OAuth 2.0

\n
    \n
  • Resource Owner — el usuario propietario de los datos.
  • \n
  • Client — su aplicación (por ejemplo, un servidor Node.js).
  • \n
  • Authorization Server — el servidor que emite tokens (por ejemplo, Google, GitHub).
  • \n
  • Resource Server — el servidor que almacena los datos del usuario.
  • \n
\n

Flujo típico de OAuth 2.0 (Authorization Code Grant)

\n
    \n
  1. El usuario hace clic en «Iniciar sesión con Google».
  2. \n
  3. La aplicación lo redirige al servidor de autorización de Google.
  4. \n
  5. El usuario da su consentimiento.
  6. \n
  7. Google devuelve un authorization code al servidor de la aplicación.
  8. \n
  9. El servidor intercambia este código por un access token.
  10. \n
  11. El servidor usa el access token para acceder a los datos del usuario.
  12. \n
\n

En la práctica, para aplicaciones simples se suele usar JWT como formato del token de acceso.

\n\n

Parte 2: JWT — estructura y principio de funcionamiento

\n

JWT (JSON Web Token) es una forma compacta y autónoma de transferir información entre partes en forma de objeto JSON. El token está firmado, por lo que se puede verificar sin necesidad de consultar una base de datos.

\n

Estructura de JWT

\n

JWT consta de tres partes separadas por puntos (.):

\n
header.payload.signature
\n
    \n
  • Header — contiene el tipo de token y el algoritmo de firma (por ejemplo, HS256).
  • \n
  • Payload — los datos (claims), como el ID del usuario, rol, tiempo de vida.
  • \n
  • Signature — la firma creada con una clave secreta.
  • \n
\n

Ejemplo de JWT decodificado

\n
{\n  "alg": "HS256",\n  "typ": "JWT"\n}\n.\n{\n  "sub": "1234567890",\n  "name": "John Doe",\n  "iat": 1516239022,\n  "exp": 1516242622\n}\n.\n[signature]
\n

Importante: el payload no está cifrado, solo firmado. ¡Nunca almacene datos confidenciales (contraseñas) en un JWT!

\n\n

Parte 3: Implementación de autorización JWT en Node.js

\n

Ahora pasemos a la práctica. Crearemos una API REST simple con Express.js y autorización JWT. Para ello necesitaremos las bibliotecas jsonwebtoken y bcryptjs.

\n

Paso 1: Instalación de dependencias

\n
npm init -y\nnpm install express jsonwebtoken bcryptjs dotenv\nnpm install --save-dev nodemon
\n

Paso 2: Configuración básica del servidor

\n
// server.js\nrequire('dotenv').config();\nconst express = require('express');\nconst jwt = require('jsonwebtoken');\nconst bcrypt = require('bcryptjs');\n\nconst app = express();\napp.use(express.json());\n\nconst users = []; // En un proyecto real — base de datos\n\nconst PORT = process.env.PORT || 3000;\nconst JWT_SECRET = process.env.JWT_SECRET || 'mysecretkey123';\n\napp.listen(PORT, () => {\n  console.log(`Server running on port ${PORT}`);\n});

                
                

Blogs

Book Recommendations