# US-MGN002-003: Cambio de Password ## Identificacion | Campo | Valor | |-------|-------| | **ID** | US-MGN002-003 | | **Modulo** | MGN-002 Users | | **Sprint** | Sprint 2 | | **Prioridad** | P0 - Critica | | **Story Points** | 3 | | **Estado** | Ready | | **Autor** | System | | **Fecha** | 2025-12-05 | --- ## Historia de Usuario **Como** usuario autenticado del sistema **Quiero** poder cambiar mi contraseña **Para** mantener mi cuenta segura y cumplir con politicas de rotacion --- ## Criterios de Aceptacion ### Escenario 1: Cambio exitoso ```gherkin Given un usuario autenticado When proporciona password actual correcto "OldPass123!" And nuevo password "NewPass456!" cumple requisitos Then el sistema actualiza el password And guarda hash en password_history And envia email de notificacion And responde con status 200 ``` ### Escenario 2: Password actual incorrecto ```gherkin Given un usuario autenticado When proporciona password actual incorrecto Then el sistema responde con status 400 And el mensaje es "Password actual incorrecto" ``` ### Escenario 3: Nuevo password no cumple requisitos ```gherkin Given un usuario autenticado When el nuevo password es "abc123" Then el sistema responde con status 400 And lista los requisitos no cumplidos: | Debe tener al menos 8 caracteres | | Debe incluir una mayuscula | | Debe incluir caracter especial | ``` ### Escenario 4: Password reutilizado ```gherkin Given un usuario que uso "MiPass123!" hace 2 meses When intenta cambiar a "MiPass123!" Then el sistema responde con status 400 And el mensaje es "No puedes usar un password que hayas usado anteriormente" ``` ### Escenario 5: Cerrar otras sesiones ```gherkin Given un usuario con 3 sesiones activas When cambia password con logoutOtherSessions=true Then el sistema actualiza el password And invalida las otras 2 sesiones And la sesion actual permanece activa And responde con sessionsInvalidated: 2 ``` --- ## Mockup / Wireframe ``` +------------------------------------------------------------------+ | [Logo] Cambiar Contraseña | +------------------------------------------------------------------+ | | | ┌─────────────────────────────────────────────────────────┐ | | │ CAMBIAR CONTRASEÑA │ | | ├─────────────────────────────────────────────────────────┤ | | │ │ | | │ Contraseña actual │ | | │ [••••••••••••••••••• ] 👁 │ | | │ │ | | │ Nueva contraseña │ | | │ [••••••••••••••••••• ] 👁 │ | | │ [████████████░░░░░░░░] Fuerte │ | | │ │ | | │ ✓ Minimo 8 caracteres │ | | │ ✓ Al menos una mayuscula │ | | │ ✓ Al menos una minuscula │ | | │ ✗ Al menos un numero │ | | │ ✗ Al menos un caracter especial │ | | │ │ | | │ Confirmar nueva contraseña │ | | │ [••••••••••••••••••• ] 👁 │ | | │ │ | | │ ☐ Cerrar sesion en otros dispositivos │ | | │ │ | | │ [ Cancelar ] [ Cambiar Contraseña ] │ | | └─────────────────────────────────────────────────────────┘ | | | +------------------------------------------------------------------+ ``` --- ## Notas Tecnicas ### API Endpoint ```typescript POST /api/v1/users/me/password { "currentPassword": "OldPass123!", "newPassword": "NewPass456!", "confirmPassword": "NewPass456!", "logoutOtherSessions": true } // Response 200 { "message": "Password actualizado exitosamente", "sessionsInvalidated": 2 } // Response 400 - Password incorrecto { "statusCode": 400, "message": "Password actual incorrecto" } // Response 400 - No cumple politica { "statusCode": 400, "message": "El password no cumple los requisitos", "errors": [ "Debe incluir al menos una mayuscula", "Debe incluir al menos un caracter especial" ] } ``` ### Politica de Password ``` - Minimo 8 caracteres - Maximo 128 caracteres - Al menos 1 mayuscula - Al menos 1 minuscula - Al menos 1 numero - Al menos 1 caracter especial (!@#$%^&*) - No puede contener el email - No puede ser igual a los ultimos 5 ``` --- ## Definicion de Done - [ ] Endpoint POST /api/v1/users/me/password - [ ] Validacion de password actual - [ ] Validacion de politica de complejidad - [ ] Verificacion contra historial (5 anteriores) - [ ] Opcion de cerrar otras sesiones - [ ] Email de notificacion enviado - [ ] Frontend: ChangePasswordForm - [ ] Frontend: PasswordStrengthIndicator - [ ] Tests unitarios - [ ] Code review aprobado --- ## Estimacion | Tarea | Horas | |-------|-------| | Backend: Endpoint | 2h | | Backend: Validaciones | 2h | | Backend: Tests | 1h | | Frontend: Form + indicator | 3h | | Frontend: Tests | 1h | | **Total** | **9h** | --- ## Historial | Version | Fecha | Autor | Cambios | |---------|-------|-------|---------| | 1.0 | 2025-12-05 | System | Creacion inicial |