- MCH-002: 4 HU (MCH-US-010 a MCH-US-013), 13 SP - MCH-003: 5 HU (MCH-US-020 a MCH-US-024), 8 SP - MCH-004: 6 HU (MCH-US-030 a MCH-US-035), 21 SP - MCH-005: 4 HU (MCH-US-040 a MCH-US-043), 13 SP Formato: Como/Quiero/Para + Criterios [CA-XXX-N] + Tareas [MCH-TT-XXX-NN] Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
8.1 KiB
| id | type | title | code | status | phase | priority | story_points | created_at | updated_at | simco_version | dependencies | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| EPIC-MCH-002 | Epic | MCH-002: Autenticacion | MCH-002 | Completado | 1 | P0 | 13 | 2026-01-05 | 2026-01-17 | 4.0.1 |
|
MCH-002: Autenticacion
Metadata
- Codigo: MCH-002
- Fase: 1 - MVP Core
- Prioridad: P0 (Critica)
- Estado: Completado
- Story Points: 13
- Fecha inicio: 2026-01-05
- Fecha fin: 2026-01-06
Descripcion
Sistema de autenticacion adaptado a micro-negocios mexicanos: login via telefono con OTP (SMS/WhatsApp), PIN de 4 digitos para acceso rapido, soporte biometrico opcional, y JWT para sesiones.
Objetivos
- Login via telefono + OTP
- PIN de 4 digitos para acceso rapido
- Soporte biometrico (Face ID/huella)
- Gestion de sesiones JWT
- Roles: owner, employee, viewer
Alcance
Incluido
- Registro con telefono
- OTP via SMS/WhatsApp
- PIN de 4 digitos
- JWT con refresh tokens
- Roles basicos (owner/employee/viewer)
- Logout y revocacion de sesiones
Excluido
- OAuth (Google, Facebook) - fase posterior
- 2FA via TOTP - fase posterior
- SSO empresarial
Flujos de Usuario
Registro Inicial
1. Usuario ingresa telefono
2. Se envia OTP via SMS/WhatsApp
3. Usuario verifica OTP
4. Usuario configura PIN de 4 digitos
5. Se crea tenant automaticamente (para owners)
6. Usuario accede al dashboard
Login Subsecuente
1. Usuario ingresa telefono
2. Usuario ingresa PIN de 4 digitos
- O usa biometrico si esta configurado
3. JWT generado
4. Acceso al sistema
Login por OTP (sin PIN)
1. Usuario selecciona "Olvide mi PIN"
2. Se envia OTP
3. Usuario verifica OTP
4. Puede reconfigurrar PIN
Modelo de Datos
Tablas (schema: auth)
users: id, tenant_id, phone, email, password_hash, name, role, pin_hash, statussessions: id, user_id, token, device_info, expires_at, revoked_atroles: id, tenant_id, name, permissions (JSONB)
Endpoints API
| Metodo | Endpoint | Descripcion |
|---|---|---|
| POST | /auth/register | Registro nuevo usuario |
| POST | /auth/send-otp | Enviar OTP a telefono |
| POST | /auth/verify-otp | Verificar OTP |
| POST | /auth/set-pin | Configurar PIN |
| POST | /auth/login | Login con telefono + PIN |
| POST | /auth/login-otp | Login solo con OTP |
| GET | /auth/me | Usuario actual |
| POST | /auth/refresh | Renovar JWT |
| POST | /auth/logout | Cerrar sesion |
| DELETE | /auth/sessions | Revocar todas las sesiones |
Entregables
| Entregable | Estado | Archivo |
|---|---|---|
| DDL auth schema | Completado | 04-auth.sql |
| auth.module.ts | Completado | modules/auth/ |
| JwtStrategy | Completado | strategies/jwt.strategy.ts |
| Guards | Completado | guards/ |
Dependencias
Depende de
- MCH-001 (Infraestructura)
Bloquea a
- MCH-003 (Productos)
- MCH-004 (POS)
- Todos los modulos que requieren auth
Criterios de Aceptacion de Epica
- Registro con telefono funcional
- OTP se envia correctamente
- PIN de 4 digitos funciona
- JWT se genera y valida
- Roles owner/employee/viewer funcionan
- Sesiones se pueden revocar
Historias de Usuario
MCH-US-010: Registro con Telefono y OTP
Como propietario de un micro-negocio Quiero registrarme usando mi numero de telefono y verificar con OTP Para crear mi cuenta de forma sencilla sin necesidad de email
Story Points: 3
Criterios de Aceptacion:
- [CA-010-1] El usuario puede ingresar su numero de telefono mexicano (10 digitos)
- [CA-010-2] Se envia OTP de 6 digitos via SMS o WhatsApp
- [CA-010-3] OTP expira en 5 minutos
- [CA-010-4] Maximo 3 intentos de verificacion antes de bloqueo temporal
- [CA-010-5] Al verificar exitosamente, se crea el tenant automaticamente
Tareas:
| ID | Tarea | Tipo | Estado |
|---|---|---|---|
| MCH-TT-010-01 | DDL tabla auth.users con campos phone, pin_hash | DDL | Completado |
| MCH-TT-010-02 | Endpoint POST /auth/register | Backend | Completado |
| MCH-TT-010-03 | Endpoint POST /auth/send-otp | Backend | Completado |
| MCH-TT-010-04 | Endpoint POST /auth/verify-otp | Backend | Completado |
| MCH-TT-010-05 | Servicio OTPService con integracion SMS | Backend | Completado |
| MCH-TT-010-06 | Tests unitarios de registro | Test | Completado |
MCH-US-011: Login con PIN de 4 Digitos
Como usuario registrado Quiero acceder a mi cuenta usando un PIN de 4 digitos Para entrar rapidamente sin tener que esperar un OTP cada vez
Story Points: 3
Criterios de Aceptacion:
- [CA-011-1] Usuario puede configurar PIN de 4 digitos despues del registro
- [CA-011-2] PIN se almacena hasheado (bcrypt)
- [CA-011-3] Login exitoso con telefono + PIN genera JWT
- [CA-011-4] 5 intentos fallidos bloquean la cuenta temporalmente (15 min)
- [CA-011-5] Opcion "Olvide mi PIN" envia OTP para recuperacion
Tareas:
| ID | Tarea | Tipo | Estado |
|---|---|---|---|
| MCH-TT-011-01 | Endpoint POST /auth/set-pin | Backend | Completado |
| MCH-TT-011-02 | Endpoint POST /auth/login (telefono + PIN) | Backend | Completado |
| MCH-TT-011-03 | Endpoint POST /auth/login-otp (recuperacion) | Backend | Completado |
| MCH-TT-011-04 | Logica de bloqueo por intentos fallidos | Backend | Completado |
| MCH-TT-011-05 | Tests unitarios de login | Test | Completado |
MCH-US-012: Gestion de Sesiones JWT
Como sistema de autenticacion Quiero manejar sesiones con JWT y refresh tokens Para mantener sesiones seguras y permitir logout remoto
Story Points: 5
Criterios de Aceptacion:
- [CA-012-1] JWT access token con expiracion de 7 dias
- [CA-012-2] Refresh token con expiracion de 30 dias
- [CA-012-3] Endpoint GET /auth/me retorna usuario actual
- [CA-012-4] Endpoint POST /auth/refresh renueva el JWT
- [CA-012-5] Endpoint POST /auth/logout revoca sesion actual
- [CA-012-6] Endpoint DELETE /auth/sessions revoca todas las sesiones
- [CA-012-7] Sessions incluyen device_info para identificacion
Tareas:
| ID | Tarea | Tipo | Estado |
|---|---|---|---|
| MCH-TT-012-01 | DDL tabla auth.sessions | DDL | Completado |
| MCH-TT-012-02 | JwtStrategy con Passport | Backend | Completado |
| MCH-TT-012-03 | Endpoint GET /auth/me | Backend | Completado |
| MCH-TT-012-04 | Endpoint POST /auth/refresh | Backend | Completado |
| MCH-TT-012-05 | Endpoint POST /auth/logout | Backend | Completado |
| MCH-TT-012-06 | Endpoint DELETE /auth/sessions | Backend | Completado |
| MCH-TT-012-07 | Tests de sesiones | Test | Completado |
MCH-US-013: Sistema de Roles Basicos
Como propietario del negocio Quiero asignar roles a mis empleados (owner, employee, viewer) Para controlar que acciones puede realizar cada persona
Story Points: 2
Criterios de Aceptacion:
- [CA-013-1] Rol owner tiene acceso completo al tenant
- [CA-013-2] Rol employee puede operar POS y ver reportes basicos
- [CA-013-3] Rol viewer solo puede consultar sin modificar
- [CA-013-4] Roles se almacenan en tabla auth.roles con permisos JSONB
- [CA-013-5] Guards validan permisos en cada endpoint protegido
Tareas:
| ID | Tarea | Tipo | Estado |
|---|---|---|---|
| MCH-TT-013-01 | DDL tabla auth.roles | DDL | Completado |
| MCH-TT-013-02 | RolesGuard para proteger endpoints | Backend | Completado |
| MCH-TT-013-03 | Decorador @Roles() para controllers | Backend | Completado |
| MCH-TT-013-04 | Seed de roles por defecto | Backend | Completado |
| MCH-TT-013-05 | Tests de autorizacion | Test | Completado |
Resumen de Story Points
| Historia | SP | Estado |
|---|---|---|
| MCH-US-010: Registro con Telefono y OTP | 3 | Completado |
| MCH-US-011: Login con PIN de 4 Digitos | 3 | Completado |
| MCH-US-012: Gestion de Sesiones JWT | 5 | Completado |
| MCH-US-013: Sistema de Roles Basicos | 2 | Completado |
| TOTAL | 13 | Completado |
Configuracion
// JWT Config
{
secret: process.env.JWT_SECRET,
expiresIn: '7d',
refreshExpiresIn: '30d'
}
// OTP Config
{
length: 6,
expiresIn: '5m',
maxAttempts: 3
}
Ultima actualizacion: 2026-01-17