Este proyecto es una aplicación de autenticación que permite a los usuarios registrarse, iniciar sesión y acceder a recursos basados en permisos específicos, utilizando PostgreSQL como base de datos.
| Característica | Descripción | 
|---|---|
| 🧾 Registro de usuarios | Los usuarios pueden crear una cuenta en el sistema. | 
| 🔐 Inicio de sesión seguro | Acceso mediante credenciales con notificación por correo si se detecta un inicio de sesión inusual. | 
| 🔁 Recuperación y actualización de contraseña | El sistema puede generar una contraseña temporal y enviarla al usuario por correo, junto con un enlace seguro para actualizarla inmediatamente si lo desea. | 
| 📚 Administración dinámica de rutas | El frontend gestiona rutas activas por rol mediante switches, enviando el array completo al backend. | 
| 🚧 Protección de rutas | Acceso restringido a rutas según los permisos asignados al usuario o al rol que tiene asignado. | 
| 🎭 Control de acceso basado en roles | Se permite o deniega el acceso a rutas específicas según el rol del usuario (admin, editor, etc). | 
| 🔑 Autenticación JWT | Implementación de JSON Web Tokens para validar sesiones de usuario de manera segura. | 
| ♻️ Tokens de renovación (refresh tokens) | Permite mantener la sesión activa sin necesidad de reautenticación frecuente. | 
| 🌐 Autenticación social | Inicio de sesión o registro mediante cuentas de Google o Microsoft. | 
Puedes visualizar el modelo de datos utilizado por el proyecto en el siguiente enlace:
🔗 Ver diagrama en dbdiagram.io
| Requisito | Descripción | 
|---|---|
| 🟢 Node.js | Versión 14 o superior (preferiblemente v16 o v18 para mejor compatibilidad). | 
| 🛢️ PostgreSQL | Sistema de base de datos relacional utilizado para persistencia. | 
| 📦 npm o yarn | Gestores de paquetes para instalar las dependencias del proyecto. | 
| 🐳 Docker (opcional) | Recomendado para el desarrollo local y despliegue en contenedores. | 
- Clona el repositorio:
git clone https://github.com/JuanjoCodedev/auth-nest.git- Configura la base de datos PostgreSQLy crea un archivo.dev.enven la raíz del proyecto con la siguiente configuración:
PORT=3000
HOST_DATABASE=localhost
POSTGRES_PORT=5432
POSTGRES_USER=tu-usuario
POSTGRES_PASSWORD=tu-contraseña
DATABASE=nombre-de-tu-base-de-datos
POSTGRES_POOL_MAX=20
POSTGRES_POOL_MIN=5
POSTGRES_IDLE_TIMEOUT=30000
SECRET_KEY=clave-secreta
EXPIRED_TOKEN=1h
EXPIRED_REFRESH_TOKEN=7d
GOOGLE_CLIENT_ID=tu-client-id-google
GOOGLE_CLIENT_SECRET=tu-client-secret-google
GOOGLE_CALLBACK_URL=http://localhost:3000/auth/google/redirect
MAILER_HOST=smtp.gmail.com
MAILER_PORT=465
MAILER_SECURE=true
MAILER_USER=your_ethereal_user
MAILER_PASS=your_ethereal_password
Si vas a utilizar Docker, cambia la línea:
HOST_DATABASE=localhostpor:
HOST_DATABASE=dbNota: Reemplaza los valores del archivo .dev.env por los mismos utilizados en tu archivo docker-compose.yml. Ejemplo:
HOST_DATABASE=db
POSTGRES_PORT=5432
POSTGRES_USER=root
POSTGRES_PASSWORD=root
DATABASE=rootEl proyecto utiliza PostgreSQL y es importante configurar correctamente el pool de conexiones para manejar cargas de tráfico de forma eficiente.
Puedes ajustar esta configuración en el archivo de conexión de TypeORM o en tu servicio de base de datos con el parámetro extra:
extra: {
  max: //Máximo de conexiones activas,                  
  min: //Conexiones mínimas vivas,                   
  idleTimeoutMillis: //Tiempo en ms antes de cerrar conexiones inactivas, 
}| Tipo de aplicación | max | min | idleTimeoutMillis | Observaciones | 
|---|---|---|---|---|
| Pequeña (< 50 req/s) | 10–20 | 2–5 | 30,000 (30s) | Ideal para desarrollo, staging o MVPs. | 
| Mediana (50–200 req/s) | 30–50 | 5–10 | 60,000 (1 min) | Equilibrio entre disponibilidad y recursos. | 
| Grande (200–1000 req/s) | 50–100 | 10–20 | 120,000 (2 min) | Requiere monitoreo y buena infraestructura de DB. | 
| Muy grande / Enterprise (> 1000 req/s) | 100–300 | 20–50 | 300,000 (5 min) | Recomendado usar PgBouncer en modo transaction pooling. | 
En este proyecto, si esperas alrededor de 500.000 solicitudes por día (~6 req/s promedio con picos de 50–100 req/s), se recomienda la siguiente configuración:
extra: {
  max: 20,
  min: 5,
  idleTimeoutMillis: 30000,
}Esto permite manejar picos de tráfico sin saturar la base de datos.
- Asegúrate de tener Dockerinstalado en tu sistema.
- Verifica que tengas un archivo .dev.envcon la configuración adecuada (ver pasos anteriores).
- Luego ejecuta:
docker-compose up --buildEsto iniciará la aplicación, la base de datos PostgreSQL y accede a Adminer desde:
http://localhost:8080
- Asegúrate de tener PostgreSQLinstalado y configurado correctamente.
- Crea tu archivo .dev.envcomo se explicó anteriormente.
- Instala las dependencias:
npm install- Ejecuta el servidor en modo build para pruebas de correo:
npm run build-and-start- O en modo desarrollo:
npm run start:devEl servidor estará disponible en http://localhost:3000 tambien puedes ingesar http://localhost:3000/api para el uso de Swagger.
| Nombre | Ruta | Método | Cuerpo de Ejemplo | 
|---|---|---|---|
| Iniciar sesión | /auth/sign-in | POST | { "email": "[email protected]", "password": "123456789" } | 
| Crear cuenta | /auth/signUp | POST | { "name": "usuario", "email": "[email protected]", "password": "123456789" } | 
| Actualizar estado | /user/:id | PUT | Ninguno | 
| Actualizar perfil | /user/profile/:id | PATCH | { "name": "usuario", "email": "[email protected]", "password": "123456789" } | 
| Registrar Rol | /role | POST | { "name": "client" } | 
| Asignar permiso a usuario por ruta | /user-route-access | POST | { "user_id": 3, "routes": ["/user/:id", "/user/profile/:id"] } | 
| Asignar permiso al rol | /role-route-access | POST | { "role_id": 3, "routes": ["/user/:id", "/user/profile/:id"] } | 
Puedes ejecutar las pruebas end-to-end con:
npm run test:e2e- 
Haz un fork del repositorio. 
- 
Crea una nueva rama: 
git checkout -b feature/nueva-caracteristica- Realiza tus cambios y haz commit:
git commit -am "Añadir nueva característica"- Sube tus cambios:
git push origin feature/nueva-caracteristicaEste proyecto está bajo la licencia MIT. Consulta el archivo LICENSE para más detalles.
Desarrollado por JuanjoCodedev