Volver a proyectos

// Expediente de evidencia

ASD Contabilidad

Ecosistema contable con sitio corporativo, portal de clientes y panel interno Electron. Incluye autenticación dual Session + JWT M2M, device binding, carga de PDFs por tipo, integridad SHA-256 y trazabilidad de documentos.

Node.jsExpressMySQLElectronJWTbcryptjsMulterCSRFRUT Module 11HelmetJestWinstonjQuerycPanel
Arquitectura técnica de ASD Contabilidad: sitio corporativo y clientes autorizados, Apache y Passenger, Express API, persistencia MySQL y almacenamiento privado de documentos.
Sitio corporativoSuperficie pública de ASD Contabilidad y Sistemas.iFormSubmitServicio externo que recibe el formulario de contacto público.iCliente WebCliente web que consulta el portal con una sesión autorizada.iApp ElectronAplicación de escritorio para la operación documental autorizada.iApache + PassengercPanel · HTTPSCapa de acceso y ejecución administrada del despliegue productivo.iExpress APIGuards · RBACServicio de aplicación que coordina autenticación, autorización y gestión documental.iMySQLPersistencia operativaPersistencia de la información operativa y trazabilidad del sistema.iStorage privadoFuera de webrootAlmacenamiento privado de los documentos de trabajo.iPOST directoHTTPS + Sesión/CSRFHTTPS + JWT M2MSolicitud validadaSQL · lectura/escrituraWrite: hash + UUIDSesión/CSRF · JWT M2M · Guards/RBAC · MySQLPDF %PDF + SHA-256 + UUID · fuera de webroot

Contexto

ASD Contabilidad & Sistemas ofrece servicios contables, tributarios, laborales, de remuneraciones y consultoría informática. La solución debía convivir con un sitio corporativo público y una operación híbrida: el trabajo documental interno se realizaba desde la oficina, mientras los clientes necesitaban consultar sus archivos desde fuera.

Problema

El contador suele trabajar fuera de la oficina, mientras los documentos permanecen centralizados allí. Para responder una solicitud puntual de un cliente podía tener que volver a buscar un archivo y enviarlo, consumiendo aproximadamente una hora en una sola gestión. Ese proceso manual vía WhatsApp u otros medios se repetía con una cartera de más de 10 clientes simultáneos y dificultaba escalar su tiempo.

Mi rol

Desarrollo integral del sitio corporativo, portal privado y aplicación Electron: modelado de datos, API Node.js/Express, pantallas de login y dashboard, gestión de clientes y documentos, autenticación, controles de seguridad, pruebas y preparación del despliegue.

Restricciones

Datos y documentos contables privados, hosting administrado con cPanel/Passenger, aplicación de escritorio para uso interno y prohibición de publicar código, credenciales o información identificable del cliente. La evidencia pública debe limitarse a flujos y arquitectura general.

Solución

El portal permite iniciar sesión con RUT y contraseña, entrar al dashboard, cambiar la contraseña cuando corresponde, consultar documentos, filtrarlos por tipo y descargarlos. El panel Electron permite administrar clientes, validar y formatear RUT mediante módulo 11, seleccionar o arrastrar PDFs, asignar tipos como F29, F22, declaración, liquidación, factura, Previred, RCV o remuneraciones, revisar los archivos de un cliente y solicitar su eliminación lógica. El backend valida el PDF, calcula su SHA-256 y registra las operaciones relevantes.

Arquitectura

La solución separa tres superficies: sitio corporativo estático, portal web servido bajo /portal y panel Electron para el contador. El backend Node.js/Express expone rutas de sesión web y rutas M2M independientes, usa MySQL como persistencia y almacena las sesiones productivas en MySQL. Los PDFs se organizan por cliente, año y tipo en un STORAGE_PATH configurado fuera de public_html.

Canalización de datos

Canalización de datos (Data Ingestion Pipeline): el sitio corporativo y su formulario público funcionan como una superficie estática; el formulario envía la consulta directamente a FormSubmit y no atraviesa el API privado. En el flujo documental, el cliente inicia sesión en /portal con RUT y contraseña, mientras la aplicación Electron obtiene un JWT M2M mediante client_id, client_secret y huella de hardware. Express valida la petición, Multer recibe el PDF temporalmente, comprueba MIME, tamaño máximo de 25 MB y firma binaria %PDF, calcula SHA-256, genera un nombre físico UUID y guarda el archivo por cliente/año/tipo en STORAGE_PATH fuera de public_html. Luego registra metadatos, hash y trazabilidad en MySQL; el cliente consulta y descarga el documento siempre a través de endpoints autorizados.

Concurrencia y pérdida de paquetes

Manejo de concurrencia y pérdida de solicitudes: Express usa handlers asíncronos y un pool MySQL de hasta 10 conexiones con espera de conexiones para atender solicitudes concurrentes. En las cargas, Multer limita el tamaño y el backend elimina el temporal cuando faltan datos, el destino no es válido o el archivo no supera la validación de PDF; los UUID evitan colisiones de nombres. La base registra metadatos y audit logs después de copiar el PDF al almacenamiento privado. No existe una cola durable, carga reanudable ni un reintento automático que abarque red, filesystem y MySQL: una caída durante la carga puede devolver error y requiere repetirla desde Electron, por lo que no se promete ausencia universal de pérdida.

Decisiones

Separé la carga interna de la consulta externa para que el portal no necesitara exponer funciones administrativas. Elegí Session + cookie HttpOnly para clientes y JWT M2M de corta duración para Electron; vinculé el dispositivo mediante huella de hardware, mantuve MySQL para datos y sesiones, usé UUID para nombres físicos y dejé el nombre original solo como metadato sanitizado.

Seguridad

Se aplican bcryptjs y política de contraseña, validación de RUT, regeneración de sesión contra session fixation, cookie HttpOnly/Secure en producción con SameSite Strict, fingerprint de sesión, CSRF para mutaciones web, Helmet, CORS restringido, JWT M2M de 15 minutos, device binding con huella SHA-256 y revocación de dispositivos. En documentos se valida MIME y firma %PDF, se limita la carga a 25 MB, se usa nombre físico UUID, almacenamiento fuera de public_html, protección IDOR/path traversal, headers de descarga segura, soft-delete y audit logs. Electron usa contextIsolation, nodeIntegration desactivado, preload limitado y safeStorage cuando el sistema operativo lo soporta.

Testing

El repositorio incluye Jest para RUT de 5 a 9 dígitos, bcrypt/JWT y política de contraseñas, validación de entradas, headers de seguridad, CORS, rate limiting, validación de PDFs, path traversal, lógica IDOR y respuestas/paginación. La evidencia disponible es principalmente de pruebas unitarias y lógica estática; no se presenta como benchmark independiente ni como una prueba pública contra el hosting productivo.

Deployment

Despliegue: la infraestructura productiva documentada se prepara en un hosting administrado con cPanel, Apache y Passenger. El backend Node.js se ejecuta como aplicación Passenger mediante server.js; el sitio corporativo y los archivos estáticos del portal se publican bajo public_html/portal. MySQL conserva usuarios, sesiones, metadatos y auditoría; los PDFs viven en STORAGE_PATH fuera de public_html. La configuración contempla HTTPS, variables de entorno, logs y tareas cron para backups y limpieza. La aplicación Electron se empaqueta para Windows y usa la URL del servidor junto con credenciales M2M; no se publican proveedor, host, secretos, documentos ni parámetros productivos.

Resultado

En una solicitud individual, el portal podía evitar aproximadamente una hora de traslado, búsqueda y envío del documento. El flujo convierte esa gestión manual en consulta directa del cliente y deja organizada la documentación por cliente, año y tipo. Según el resultado reportado del proyecto, los tiempos de gestión documental y administrativa se redujeron aproximadamente en un 64%; la cifra describe este caso concreto y no se presenta como un benchmark independiente.

Evidencia

Evidencia pública: demo del portal y del panel Electron, además de esta descripción del flujo. El repositorio privado incluye la suite Jest como evidencia técnica adicional, pero no se publican código, documentos, credenciales ni datos identificables del cliente. La demo acredita el recorrido funcional; no constituye por sí sola una auditoría independiente de seguridad ni de la métrica del 64%.