Servidor Express con arquitectura por capas similar a NestJS y autenticación JWT completa y segura.
authentication/
├── config/ # Configuraciones (CORS, base de datos)
├── controllers/ # Controladores (manejan peticiones HTTP)
├── services/ # Servicios (lógica de negocio)
├── repositories/ # Repositorios (interacción con base de datos)
├── routes/ # Definición de rutas
├── middleware/ # Middlewares personalizados
├── utils/ # Utilidades (JWT helpers)
├── prisma/ # Schema y migraciones de Prisma
└── index.js # Punto de entrada de la aplicación
- Instalar dependencias:
npm install- Configurar variables de entorno:
Crea un archivo
.enven la raíz del proyecto con el siguiente contenido:
PORT=3000
NODE_ENV=development
# JWT Configuration
JWT_SECRET=tu_secreto_super_seguro_cambia_esto_en_produccion_minimo_32_caracteres
JWT_ACCESS_TOKEN_EXPIRES_IN=15m
JWT_REFRESH_TOKEN_EXPIRES_IN=7d
# Database
DATABASE_URL="file:./prisma/dev.db"
# Security
BCRYPT_ROUNDS=12JWT_SECRET por un valor seguro de al menos 32 caracteres aleatorios.
- Generar el cliente de Prisma:
npm run prisma:generate- Ejecutar migraciones (crea la base de datos):
npm run prisma:migratenpm run devnpm startnpm run prisma:studio-
POST /api/auth/register- Registrar un nuevo usuario{ "email": "[email protected]", "password": "contraseña123", "name": "Nombre del Usuario" } -
POST /api/auth/login- Iniciar sesión{ "email": "[email protected]", "password": "contraseña123" } -
POST /api/auth/refresh- Refrescar access token{ "refreshToken": "refresh_token_aquí" }O enviar el refresh token como cookie httpOnly.
-
POST /api/auth/logout- Cerrar sesión- Header:
Authorization: Bearer <access_token>
- Header:
-
GET /api/auth/profile- Obtener perfil del usuario autenticado- Header:
Authorization: Bearer <access_token>
- Header:
Todas las rutas de usuarios requieren autenticación (header Authorization: Bearer <access_token>)
GET /api/users- Obtener todos los usuariosGET /api/users/:id- Obtener un usuario por IDPOST /api/users-⚠️ No disponible (usar/api/auth/registerpara crear usuarios)PUT /api/users/:id- Actualizar un usuarioDELETE /api/users/:id- Eliminar un usuario
-
Registro/Login: El usuario se registra o inicia sesión
- Se genera un access token (válido por 15 minutos)
- Se genera un refresh token (válido por 7 días)
- El refresh token se almacena como cookie httpOnly y en la base de datos
-
Acceso a rutas protegidas:
- Incluir el access token en el header:
Authorization: Bearer <access_token>
- Incluir el access token en el header:
-
Renovación del access token:
- Cuando el access token expire, usar el refresh token para obtener uno nuevo
- El refresh token puede enviarse en el body o como cookie httpOnly
-
Cerrar sesión:
- El refresh token se elimina de la base de datos y de las cookies
# 1. Registro
curl -X POST http://localhost:3000/api/auth/register \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "contraseña123",
"name": "Usuario Ejemplo"
}'
# Respuesta incluye accessToken
# {
# "success": true,
# "message": "Usuario registrado exitosamente",
# "data": {
# "user": { ... },
# "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
# }
# }
# 2. Login
curl -X POST http://localhost:3000/api/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "contraseña123"
}'
# 3. Acceder a ruta protegida
curl -X GET http://localhost:3000/api/auth/profile \
-H "Authorization: Bearer <access_token>"
# 4. Refrescar token
curl -X POST http://localhost:3000/api/auth/refresh \
-H "Content-Type: application/json" \
-d '{
"refreshToken": "<refresh_token>"
}'
# 5. Cerrar sesión
curl -X POST http://localhost:3000/api/auth/logout \
-H "Authorization: Bearer <access_token>"- ✅ Passwords hasheados con bcrypt (12 rounds)
- ✅ JWT con expiración corta para access tokens (15 min)
- ✅ Refresh tokens con expiración larga (7 días)
- ✅ Refresh tokens almacenados en BD para invalidación
- ✅ Cookies httpOnly para refresh tokens (protección XSS)
- ✅ Validación de email y password (mínimo 8 caracteres)
- ✅ Tokens firmados con secreto seguro
- ✅ Middleware de autenticación para proteger rutas
- ✅ Manejo de errores específico para tokens expirados/inválidos
- ✅ Datos sensibles nunca expuestos (passwords y refresh tokens no se devuelven)
- ✅ Express con configuración básica
- ✅ CORS configurado
- ✅ Handler global para endpoints no definidos (404)
- ✅ Handler global para el manejo de errores
- ✅ Prisma con SQLite3
- ✅ Arquitectura por capas (Routes → Controllers → Services → Repositories)
- ✅ Autenticación JWT completa y segura
- ✅ Gestión de refresh tokens
- ✅ Validación de datos de entrada
model User {
id Int @id @default(autoincrement())
email String @unique
name String?
password String // Hasheado con bcrypt
refreshToken String? // Refresh token actual
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}- En producción, cambia el
JWT_SECRETpor un valor aleatorio seguro de al menos 32 caracteres - Usa HTTPS en producción para proteger los tokens en tránsito
- Configura CORS apropiadamente según tu frontend
- Considera rate limiting para prevenir ataques de fuerza bruta
- Implementa logging de intentos de autenticación fallidos
- Considera 2FA para mayor seguridad en producción