ALIANPOS V9.6.5 — QA LOGIN / RECUPERACION TOKENIZADA
Fecha: 2026-09-13

VALIDACION ESTATICA REALIZADA
[OK] PHP syntax: AuthController.php
[OK] PHP syntax: login.php
[OK] PHP syntax: password_reset.php
[OK] PHP syntax: routes/auth.php
[OK] PHP syntax: config/security.php
[OK] PHP syntax: config/app.php
[OK] JavaScript syntax: alian.ajax.js

CONTROLES VERIFICADOS EN FUENTE
[OK] Login no contiene captcha.
[OK] authenticate() no valida captcha.
[OK] Captcha se valida únicamente al solicitar recuperación.
[OK] La pantalla de login no contiene formulario visible de cambio de contraseña.
[OK] Recuperación ya no utiliza código de 6 dígitos.
[OK] Token generado con random_bytes(32).
[OK] Base de datos almacena token_hash SHA-256, no el token plano.
[OK] Enlace con expiración configurable.
[OK] Token de un solo uso mediante estado pendiente -> usado.
[OK] Validación de token seguida de redirección a URL limpia.
[OK] Formulario final depende de autorización de sesión.
[OK] POST final no recibe email/token/código del navegador.
[OK] CSRF y honeypot permanecen activos.
[OK] Rate limit permanece activo en login y recuperación.
[OK] Respuesta de solicitud no confirma existencia de la cuenta.
[OK] HTTPS obligatorio para enlaces de recuperación en producción.
[OK] No-cache/no-store y noindex en vistas sensibles.
[OK] security_version se incrementa tras cambio de contraseña.
[OK] Migración cancela recuperaciones pendientes del flujo anterior.

PRUEBAS FUNCIONALES REQUERIDAS EN SERVIDOR
1. Ejecutar migración 043.
2. Confirmar MAIL_FROM_ADDRESS y envío real del servidor.
3. Solicitar recuperación de una cuenta central.
4. Solicitar recuperación de una cuenta de franquicia.
5. Solicitar recuperación de una cuenta POS.
6. Verificar que el mismo enlace no permita un segundo cambio.
7. Verificar que un enlace vencido muestre "Enlace no disponible".
8. Confirmar que las sesiones antiguas queden invalidadas tras el cambio.
