# US-MGN-001-005-001: Reset de Contraseña (Forgot Password)

**RF Asociado:** [RF-MGN-001-005](../../02-modelado/requerimientos-funcionales/mgn-001/RF-MGN-001-005-reset-password.md)
**Módulo:** MGN-001 - Fundamentos
**Epic:** Autenticación y Seguridad
**Prioridad:** P0 (MVP)
**Story Points:** 5
**Sprint:** Sprint 2
**Fecha:** 2025-11-24

---

## User Story

**Como** usuario que olvidó su contraseña,
**Quiero** recibir un enlace por email para resetearla,
**Para** recuperar acceso a mi cuenta sin contactar al administrador.

---

## Criterios de Aceptación

### Escenario 1: Solicitar reset de contraseña
**Cuando** ingreso mi email y solicito reset,
**Entonces** recibo email con enlace de reset válido por 1 hora.

### Escenario 2: Resetear contraseña con token válido
**Cuando** abro enlace y establezco nueva contraseña,
**Entonces** password actualizado, tokens revocados, puedo hacer login.

### Escenario 3: Token expirado o inválido
**Cuando** uso token expirado (>1 hora) o inválido,
**Entonces** retorna error "Token inválido o expirado".

---

## Reglas de Negocio

- **RN-1:** Token de reset expira en 1 hora
- **RN-2:** Token es single-use (se marca como usado)
- **RN-3:** Al resetear: revocar todos los refresh tokens
- **RN-4:** No revelar si email existe o no (prevenir user enumeration)

---

## Tareas Técnicas

### Backend
- [ ] POST /api/v1/auth/forgot-password - Generar token
- [ ] POST /api/v1/auth/reset-password - Resetear con token
- [ ] Tabla: auth.password_reset_tokens
- [ ] Enviar email con enlace
- [ ] Tests (8 casos)

### Frontend
- [ ] ForgotPasswordPage con formulario email
- [ ] ResetPasswordPage con token + nueva password
- [ ] Tests

---

## Estimación: 5 SP

---

## Referencias

- [RF-MGN-001-005](../../02-modelado/requerimientos-funcionales/mgn-001/RF-MGN-001-005-reset-password.md)
