Este proyecto implementa un sistema de autenticación utilizando JSON Web Tokens (JWT) en una aplicación Node.js con Express. Incluye un frontend simple para demostrar el funcionamiento del sistema.
Magdalena Inalaf
- GitHub: https://github.com/MagdaIG
- LinkedIn: https://www.linkedin.com/in/minalaf/
- Página web: https://inalaf.ca/
- Email: magda.inalaf@gmail.com
Este proyecto demuestra cómo implementar:
- Registro de usuarios
- Inicio de sesión con generación de JWT
- Protección de rutas mediante middleware de autenticación
- Verificación de tokens JWT
- Manejo de errores en autenticación
- Node.js (versión 14 o superior)
- npm (incluido con Node.js)
-
Clona o descarga este repositorio
-
Abre una terminal en el directorio del proyecto
-
Instala las dependencias necesarias:
npm installEsto instalará las siguientes dependencias:
- express: Framework web para Node.js
- jsonwebtoken: Librería para crear y verificar JWT
- body-parser: Middleware para parsear el cuerpo de las peticiones HTTP
El servidor está configurado para ejecutarse en el puerto 3000 por defecto. Puedes cambiar el puerto modificando la variable PORT en el archivo server.js.
La clave secreta para firmar los tokens JWT está definida en la variable SECRET_KEY en server.js. En un entorno de producción, deberías usar una variable de entorno para almacenar esta clave de forma segura.
Para iniciar el servidor, ejecuta:
npm startO alternativamente:
node server.jsDeberías ver un mensaje en la consola indicando que el servidor está corriendo:
Servidor corriendo en http://localhost:3000
Frontend disponible en http://localhost:3000
Una vez que el servidor esté corriendo, abre tu navegador web y visita:
http://localhost:3000
Verás una interfaz intuitiva con un indicador de progreso y tres pestañas que te guían paso a paso a través del proceso de autenticación JWT.
La aplicación está diseñada con una interfaz clara que muestra el progreso en cada paso. A continuación se explica cada paso con capturas de pantalla:
En esta primera pantalla puedes crear una nueva cuenta de usuario:
-
Indicador de Progreso: En la parte superior verás un indicador visual que muestra tres pasos. El Paso 1 está resaltado en color púrpura/azul, indicando que es el paso actual.
-
Instrucciones: La sección incluye instrucciones claras que explican: "Crea una cuenta nueva ingresando tu email y contraseña. Esto guardará tu usuario en el sistema."
-
Formulario de Registro:
- Email: Ingresa un email válido (ejemplo:
usuario@ejemplo.com) - Contraseña: Ingresa una contraseña
- Haz clic en el botón "Registrarse" con el gradiente púrpura/azul
- Email: Ingresa un email válido (ejemplo:
-
Confirmación: Si el registro es exitoso, verás un mensaje verde con un checkmark que dice: "✓ Registro exitoso. Ahora ve al Paso 2: Iniciar Sesión para obtener tu token JWT."
El indicador de progreso mostrará el Paso 1 como completado (con un checkmark verde) cuando el registro sea exitoso.
Esta es la pantalla donde obtendrás tu token JWT:
-
Indicador de Progreso: El Paso 1 aparece marcado como completado (checkmark verde), y el Paso 2 está activo (círculo púrpura con el número 2).
-
Credenciales de Prueba: En un recuadro amarillo destacado, encontrarás:
- Email de prueba:
test@example.com - Password de prueba:
test123 - Un botón amarillo "Usar credenciales de prueba" que llena automáticamente los campos
- Email de prueba:
-
Formulario de Login:
- Ingresa el email y contraseña (puedes usar las credenciales de prueba o las que registraste)
- Haz clic en "Iniciar Sesión"
-
Token JWT: Al iniciar sesión exitosamente:
- Verás un mensaje de éxito indicando que tu token JWT aparece abajo
- En la sección inferior "Token JWT" verás:
- Estado: "TOKEN ACTIVO" (badge verde)
- El token completo (una cadena larga que comienza con
eyJ...) - Botones para "Copiar Token" y "Limpiar Token"
- El token se guarda automáticamente en el navegador
-
Siguiente Paso: Aparecerá un mensaje verde indicando que puedes ir al Paso 3 para ver tu perfil.
Esta pantalla demuestra el acceso a una ruta protegida usando JWT:
-
Indicador de Progreso: Los Pasos 1 y 2 aparecen completados (checkmarks verdes), y el Paso 3 está activo (círculo azul con el número 3).
-
Instrucciones: La sección explica: "Esta es una ruta protegida. Solo puedes acceder si tienes un token JWT válido. Haz clic en el botón para cargar tu perfil."
-
Cargar Perfil: Haz clic en el botón "Cargar Mi Perfil" con gradiente púrpura/azul.
-
Información del Perfil: Si el token es válido, verás:
- ID de Usuario: El ID asignado al registrarte
- Email: Tu dirección de email
- Un mensaje de confirmación: "✓ Acceso exitoso a ruta protegida usando JWT"
-
Token JWT: En la parte inferior, la sección del token muestra:
- Estado "TOKEN ACTIVO" (badge verde)
- Explicación del token: "Este es tu token de autenticación. Se genera automáticamente al iniciar sesión y se usa para acceder a rutas protegidas."
- El token completo visible
- Opciones para copiar o limpiar el token
Si intentas acceder sin un token válido, verás un mensaje de error indicando que necesitas autenticarte primero.
curl -X POST http://localhost:3000/register \
-H "Content-Type: application/json" \
-d '{"email":"usuario@example.com","password":"miPassword123"}'curl -X POST http://localhost:3000/login \
-H "Content-Type: application/json" \
-d '{"email":"usuario@example.com","password":"miPassword123"}'La respuesta incluirá un token JWT:
{
"success": true,
"message": "Inicio de sesión exitoso",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "usuario@example.com"
}
}curl -X GET http://localhost:3000/profile \
-H "Authorization: Bearer TU_TOKEN_JWT_AQUI"usuario-jwt/
├── server.js # Servidor Express con rutas y middleware
├── package.json # Dependencias y configuración del proyecto
├── README.md # Este archivo
├── images/ # Imágenes de documentación
│ ├── paso1.png # Captura de pantalla - Paso 1
│ ├── paso2.png # Captura de pantalla - Paso 2
│ └── paso3.png # Captura de pantalla - Paso 3
└── public/ # Archivos del frontend
├── index.html # Interfaz de usuario
├── styles.css # Estilos CSS
└── app.js # Lógica del frontend
Registra un nuevo usuario.
Body:
{
"email": "usuario@example.com",
"password": "miPassword123"
}Respuesta exitosa (201):
{
"success": true,
"message": "Usuario registrado exitosamente",
"user": {
"id": 1,
"email": "usuario@example.com"
}
}Inicia sesión y genera un token JWT.
Body:
{
"email": "usuario@example.com",
"password": "miPassword123"
}Respuesta exitosa (200):
{
"success": true,
"message": "Inicio de sesión exitoso",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": 1,
"email": "usuario@example.com"
}
}Obtiene el perfil del usuario autenticado. Requiere autenticación JWT.
Headers:
Authorization: Bearer TU_TOKEN_JWT_AQUI
Respuesta exitosa (200):
{
"success": true,
"message": "Perfil del usuario",
"user": {
"id": 1,
"email": "usuario@example.com"
}
}El servidor maneja los siguientes casos de error:
- 400 Bad Request: Datos incompletos en la solicitud
- 401 Unauthorized: Contraseña incorrecta o token no proporcionado
- 403 Forbidden: Token inválido o expirado
- 404 Not Found: Usuario no encontrado
- 409 Conflict: Usuario ya existe (en registro)
Todas las respuestas de error incluyen un objeto JSON con los campos error y message:
{
"error": "Usuario no encontrado",
"message": "No existe un usuario con ese email"
}- Algoritmo: HS256
- Tiempo de expiración: 1 hora
- Payload: Contiene
userIdyemaildel usuario
Este proyecto es una demostración educativa. Para un entorno de producción, considera:
- Usar variables de entorno para la clave secreta JWT
- Hashear las contraseñas con bcrypt antes de almacenarlas
- Implementar rate limiting para prevenir ataques de fuerza bruta
- Usar HTTPS para todas las comunicaciones
- Validar y sanitizar todas las entradas del usuario
- Implementar refresh tokens para mejorar la seguridad
- Usar una base de datos real en lugar de un array en memoria
- Verifica que el puerto 3000 no esté en uso
- Asegúrate de haber instalado todas las dependencias con
npm install - Revisa que tengas Node.js instalado correctamente
- Asegúrate de que el servidor esté corriendo
- Verifica que estés accediendo a
http://localhost:3000 - Revisa que la carpeta
publicexista y contengaindex.html
- Verifica que el token no haya expirado (expira después de 1 hora)
- Asegúrate de incluir el token en el header
Authorizationcon el formatoBearer TOKEN - Verifica que estés usando el mismo servidor que generó el token
ISC


