Un sistema completo de autenticación construido con Express.js, React, TypeScript y AWS Cognito, que incluye autenticación de dos factores (MFA) sin necesidad de acceder a la consola de AWS.
-
🔐 Autenticación Completa
- Registro de usuarios con validación de email
- Login con credenciales
- Confirmación de registro por email
- Logout seguro
- Gestión de tokens JWT
-
🔒 Autenticación de Dos Factores (MFA)
- Configuración de MFA con QR Code
- Verificación de códigos TOTP
- Códigos de respaldo para emergencias
- Verificación local para testing
- Integración con aplicaciones como Google Authenticator, Authy, etc.
-
👥 Gestión de Usuarios
- Listado de usuarios
- Actualización de perfiles
- Eliminación de usuarios
- Visualización de estados (activo/inactivo, MFA habilitado)
-
🔧 Funcionalidades Adicionales
- Cambio de contraseña
- Recuperación de contraseña
- Validaciones robustas
- Manejo de errores detallado
- Rate limiting
- Seguridad con Helmet
cognito/
├── src/ # Backend (Express.js + TypeScript)
│ ├── config/ # Configuración de AWS
│ ├── controllers/ # Controladores de la API
│ ├── routes/ # Rutas de la API
│ ├── services/ # Servicios de negocio
│ ├── types/ # Tipos TypeScript
│ └── server.ts # Servidor principal
├── client/ # Frontend (React + TypeScript)
│ ├── src/
│ │ ├── components/ # Componentes React
│ │ ├── contexts/ # Contexto de autenticación
│ │ ├── services/ # Servicios de API
│ │ └── types/ # Tipos TypeScript
│ └── package.json
├── package.json # Dependencias del backend
└── README.md
- Node.js + Express.js
- TypeScript
- AWS SDK v2 para Cognito
- Speakeasy para generación de códigos TOTP
- QRCode para generación de códigos QR
- Helmet para seguridad
- CORS para comunicación entre dominios
- Rate Limiting para protección contra ataques
- React 18 con TypeScript
- Vite como bundler
- React Router para navegación
- Axios para llamadas HTTP
- Context API para estado global
Antes de ejecutar el proyecto, necesitas configurar AWS Cognito:
- Crear User Pool en AWS Cognito
- Configurar App Client
- Habilitar MFA (Software Token)
- Configurar políticas de contraseña
- Configurar triggers de email (opcional)
# AWS Cognito Configuration
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your_access_key_id
AWS_SECRET_ACCESS_KEY=your_secret_access_key
# Cognito User Pool
COGNITO_USER_POOL_ID=us-east-1_xxxxxxxxx
COGNITO_CLIENT_ID=your_client_id
COGNITO_CLIENT_SECRET=your_client_secret
# Server Configuration
PORT=3001
NODE_ENV=development
# JWT Secret for additional security
JWT_SECRET=your_jwt_secret_key_here
# Frontend URL for CORS
FRONTEND_URL=http://localhost:5173
# MFA Configuration
MFA_ENABLED=true
MFA_ISSUER=CognitoAuthSystem
VITE_API_URL=http://localhost:3001/api
# Instalar dependencias del backend
npm install
# Instalar dependencias del frontend
cd client
npm install
cd ..
# Copiar archivos de ejemplo
cp env.example .env
cd client
cp env.example .env
cd ..
# Editar las variables con tus credenciales de AWS
- Ve a AWS Console → Cognito → User Pools
- Crea un nuevo User Pool
- Configura las políticas de contraseña:
- Mínimo 8 caracteres
- Requerir mayúsculas, minúsculas y números
- Requerir caracteres especiales (opcional)
- En tu User Pool, ve a "App clients"
- Crea un nuevo app client
- Habilita "USER_PASSWORD_AUTH" en Authentication flows
- Guarda el Client ID y Client Secret
- En tu User Pool, ve a "Sign-in experience"
- En "Multi-factor authentication", selecciona "Optional"
- En "MFA methods", habilita "Software token MFA (TOTP)"
# Desarrollo (ambos servidores)
npm run dev
# O ejecutar por separado:
# Backend
npm run dev:server
# Frontend (en otra terminal)
npm run dev:client
- Ve a
/register
- Completa el formulario con:
- Usuario único
- Email válido
- Contraseña que cumpla los requisitos
- Confirma el registro con el código enviado por email
- Inicia sesión en
/login
- En el dashboard, configura MFA
- Escanea el código QR con tu aplicación de autenticación
- Verifica la configuración con un código de prueba
- Inicia sesión con tus credenciales
- Si MFA está habilitado, ingresa el código de tu aplicación
- Accede al dashboard
- Ver perfil: Información personal y estado de MFA
- Gestionar usuarios: Listar, actualizar y eliminar usuarios
- Cambiar contraseña: Actualizar credenciales de forma segura
POST /api/auth/register
- Registrar usuarioPOST /api/auth/confirm-registration
- Confirmar registroPOST /api/auth/login
- Iniciar sesiónPOST /api/auth/logout
- Cerrar sesión
POST /api/auth/setup-mfa
- Configurar MFAPOST /api/auth/verify-mfa
- Verificar código MFAPOST /api/auth/verify-mfa-local
- Verificación local
GET /api/auth/user/info
- Obtener información del usuarioGET /api/auth/users
- Listar usuariosPUT /api/auth/user/update
- Actualizar usuarioDELETE /api/auth/user/:username
- Eliminar usuario
POST /api/auth/change-password
- Cambiar contraseñaPOST /api/auth/forgot-password
- Solicitar restablecimientoPOST /api/auth/confirm-forgot-password
- Confirmar restablecimiento
- Rate Limiting: Protección contra ataques de fuerza bruta
- Helmet: Headers de seguridad HTTP
- CORS: Configuración segura para comunicación entre dominios
- Validación: Validación robusta de datos de entrada
- Manejo de Errores: Errores seguros sin exposición de información sensible
- Tokens JWT: Gestión segura de tokens de autenticación
- TOTP: Códigos de tiempo único (RFC 6238)
- QR Codes: Configuración fácil con aplicaciones estándar
- Backup Codes: Códigos de emergencia para recuperación
- Verificación Local: Testing sin comprometer seguridad
El sistema incluye una función de verificación local para testing:
// En el frontend, puedes verificar códigos MFA localmente
const response = await apiService.verifyMFALocally(secret, token);
curl http://localhost:3001/health
-
Error de configuración AWS
- Verifica que las credenciales de AWS sean correctas
- Asegúrate de que el User Pool y App Client existan
- Confirma que MFA esté habilitado en el User Pool
-
Error de CORS
- Verifica que
FRONTEND_URL
esté configurado correctamente - Asegúrate de que el frontend esté corriendo en el puerto correcto
- Verifica que
-
Error de MFA
- Verifica que la aplicación de autenticación esté sincronizada
- Usa los códigos de respaldo si es necesario
- Confirma que el secreto se haya configurado correctamente
-
Error de validación
- Verifica que las contraseñas cumplan los requisitos
- Asegúrate de que el email tenga formato válido
- Confirma que el usuario no exista ya
- Integración con PrimeReact para UI mejorada
- Soporte para múltiples proveedores de MFA
- Dashboard administrativo avanzado
- Logs de auditoría
- Integración con otros servicios AWS
- Tests automatizados
- Dockerización del proyecto
- CI/CD pipeline