RF07: Usuario actualiza contraseña
Descripción
Como usuario autenticado, quiero cambiar mi contraseña para mantener mi cuenta segura.
El cambio exige la contraseña actual, valida la nueva contra la política de fortaleza, la hashea con Argon2id y revoca todas las sesiones excepto la actual (revoked_by = 'password_change'), conforme al Control de Sesiones §5.
| Campo | Valor |
|---|---|
| Módulo | Auth Module |
| Actor | Usuario autenticado |
| Endpoint | PATCH /auth/password |
| Precondiciones | Sesión activa; la cuenta tiene contraseña (no solo-social) |
| Prioridad | Alta (MVP) |
| Etapa | MVP |
| Requisitos relacionados | RF02, RF11 |
Reglas de negocio
- RN-07.1 — Se requiere y verifica la contraseña actual antes de aceptar el cambio.
- RN-07.2 — La nueva contraseña debe cumplir la misma política que el registro y ser distinta de la actual.
- RN-07.3 — Al cambiarla se revocan todas las demás sesiones; la sesión actual se conserva.
- RN-07.4 — Se envía email de confirmación con enlace para reportar si no fue el usuario.
Validaciones de entrada
| Campo | Reglas | Mensaje de error |
|---|---|---|
currentPassword | Obligatorio. Debe coincidir con el hash actual. | "Tu contraseña actual es incorrecta." |
newPassword | Obligatorio. 8–64 caracteres, 1 mayúscula, 1 minúscula, 1 número. Distinta de la actual. | "La nueva contraseña no cumple los requisitos." / "La nueva contraseña debe ser distinta de la actual." |
Criterios de aceptación
Escenario 1: Cambio exitoso
Dado que ingreso mi contraseña actual correcta y una nueva válida,
Cuando confirmo el cambio,
Entonces el sistema actualiza el hash Argon2id,
Y revoca todas mis demás sesiones,
Y responde 200 OK,
Y me envía un email de confirmación.
Escenario 2: Contraseña actual incorrecta
Dado que ingreso mal mi contraseña actual,
Cuando intento cambiarla,
Entonces el sistema responde 401 con "Tu contraseña actual es incorrecta",
Y no modifica nada.
Escenario 3: Nueva contraseña inválida o igual a la actual
Dado que la nueva contraseña no cumple la política o es igual a la actual,
Cuando intento guardar,
Entonces el sistema responde 400 con el mensaje correspondiente.
Escenario 4: Sesiones revocadas tras el cambio
Dado que cambié mi contraseña,
Cuando otro dispositivo intenta renovar su token,
Entonces su sesión fue revocada (password_change) y debe volver a iniciar sesión.
Criterios no funcionales
- La contraseña nunca viaja ni se guarda en claro; consultas parametrizadas (sin inyección SQL).
- Comunicación sobre TLS 1.2+.