Sistema de Autenticación
Sistema de Autenticación
Sección titulada «Sistema de Autenticación»El sistema de autenticación de Te Afirmo utiliza sesiones basadas en cookies, verificación de email con TOTP, y hash seguro de contraseñas.
🔐 Componentes del Sistema
Sección titulada «🔐 Componentes del Sistema»1. Registro de Usuarios
Sección titulada «1. Registro de Usuarios»Endpoint: POST /api/auth/register
Flujo:
- Usuario proporciona email, contraseña, nombre y rol
- Se valida con Zod schema
- Se sanitiza el email
- Se crea hash de la contraseña con bcrypt
- Se genera código TOTP para verificación
- Se guarda en base de datos (Turso)
- Se envía email con código de verificación
Roles disponibles:
natural- Persona Naturaljuridica- Persona Jurídica
2. Verificación de Email
Sección titulada «2. Verificación de Email»Endpoint: POST /api/auth/verify
Flujo:
- Usuario proporciona email y código TOTP
- Se valida el código contra el secret almacenado
- Se actualiza
email_verified = 1en la base de datos - Se envía email de bienvenida
3. Inicio de Sesión
Sección titulada «3. Inicio de Sesión»Endpoint: POST /api/auth/login
Flujo:
- Usuario proporciona email, contraseña y selecciona el perfil con el que desea entrar
- Se busca usuario en la base de datos y se valida que el perfil esté permitido
- Se verifica que el email esté verificado
- Se compara la contraseña con bcrypt
- Se crea una sesión guardando el rol efectivo
- Se devuelve cookie de sesión
4. Gestión de Sesiones
Sección titulada «4. Gestión de Sesiones»Archivo: src/utils/auth.ts
Funciones principales:
createSession(userId, role)- Crea una nueva sesión con el rol efectivodestroySession(token)- Elimina una sesióngetSessionFromRequest(request)- Obtiene sesión desde requestrequireSession(request, options)- Requiere sesión válida
Cookie de sesión:
- Nombre:
teafirmo_session - HttpOnly: Sí (seguridad)
- SameSite: Strict
- Duración: 24 horas
🔒 Seguridad
Sección titulada «🔒 Seguridad»Hash de Contraseñas
Sección titulada «Hash de Contraseñas»import bcrypt from 'bcryptjs';
// Crear hashconst hash = await bcrypt.hash(password, 10);
// Verificarconst matches = await bcrypt.compare(password, hash);Sanitización
Sección titulada «Sanitización»Todos los inputs se sanitizan antes de procesarse:
import { sanitizeEmail, sanitizeString } from '../utils/sanitize';
const email = sanitizeEmail(rawEmail);const name = sanitizeString(rawName);Validación
Sección titulada «Validación»Se usa Zod para validación de esquemas:
import { registerSchema, validateWithSchema } from '../types/validation';
const validation = validateWithSchema(registerSchema, data);if (!validation.success) { // Manejar errores}📋 Estructura de Base de Datos
Sección titulada «📋 Estructura de Base de Datos»Tabla users
Sección titulada «Tabla users»CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL UNIQUE, password_hash TEXT NOT NULL, role TEXT NOT NULL CHECK(role IN ('natural', 'juridica', 'admin')), available_roles TEXT, email_verified INTEGER NOT NULL DEFAULT 0, totp_secret TEXT, totp_issued_at INTEGER, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')));Tabla sessions
Sección titulada «Tabla sessions»CREATE TABLE sessions ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER NOT NULL, token TEXT NOT NULL UNIQUE, role TEXT, expires_at INTEGER NOT NULL, created_at INTEGER NOT NULL DEFAULT (strftime('%s', 'now')), FOREIGN KEY (user_id) REFERENCES users(id));Roles Adicionales y Sesiones Multi Perfil
Sección titulada «Roles Adicionales y Sesiones Multi Perfil»users.available_rolesalmacena (en JSON) los perfiles extra habilitados para una cuenta específica.- El rol principal sigue definido por
users.roley siempre se incluye automáticamente. - Al iniciar sesión se valida que el perfil solicitado pertenezca a
{rol principal} ∪ available_roles. - El rol efectivo se persiste en
sessions.role, por lo que cada sesión recuerda con qué perfil se autenticó el usuario. - Los endpoints protegidos leen ese rol efectivo mediante
requireSessionpara determinar si el acceso corresponde a Persona Natural, Persona Jurídica o Administración.
🔄 Flujo Completo
Sección titulada «🔄 Flujo Completo»- Registro → Usuario se registra → Recibe código TOTP
- Verificación → Usuario verifica email → Cuenta activada
- Login → Usuario inicia sesión → Recibe cookie de sesión
- Acceso → Usuario accede a recursos protegidos → Sesión validada