Seguridad
Lo que está hecho
- Argon2id para contraseñas, con bloqueo temporal por intentos fallidos. Comprobado en la práctica: bloquea de verdad.
- JWT de vida corta (30 min) en memoria en web y en
expo-secure-storeen móvil. Nunca enlocalStorageniAsyncStorage. - Refresh rotatorio con hash SHA-256 en base y detección de reutilización: si llega un token ya revocado, se revoca toda la cadena.
- Autorización por rol declarada en el contrato y aplicada en el servidor.
- Auditoría en
audit_log, con estado antes y después. - Firmas de webhook verificadas siempre; una firma inválida se registra y no se procesa.
- Sin SQL por concatenación: los filtros dinámicos se arman con
QueryBuildery todos los valores van ligados. - CSP en el front, que sólo permite conectar con la API.
Recuperación de acceso
crm-api set-password <correo> <clave-nueva>
Restablece la clave, quita el bloqueo y limpia el «debe cambiar la contraseña». Requiere acceso al servidor, que es exactamente la barrera que debe tener.
Lo que NO está hecho
- Sin respaldo diario. Es un requisito no funcional explícito y falta.
- Sin cifrado en reposo.
- Sin alertas. Los registros van a un fichero.
Ver Deuda técnica.