Recuperar Contraseña
===
[TOC]
[[_TOC_]]
General
--
#### Definición
La recuperación de contraseña es un proceso que se debe implementar para una gestión de usuarios adecuado, el principal propósito de esto es que el usuario pueda recuperar su contraseña.
#### :heavy_check_mark: Reglas de seguridad de contraseñas
> * Largo mínimo: _Caracteres mínimos aceptados para la contraseña por recomendacion de **OWASP** debe ser mínimo **8**._
> * Requiere al menos una mayúscula _La contraseña debe tener al menos una mayúscula._
> * Requiere al menos un número: _La contraseña debe tener al menos un número._
> * Requiere al menos un caracter especial: _La contraseña debe tener al menos un caracter especial que no sea ni letra del abcedario o un número._
> * Requiere al menos una minúscula: _La contraseña debe tener al menos una minúscula._
> * Longevidad de contraseña: _La misma contraseña no se puede utilizar en un periodo determinado y configurable de tiempo._
#### :lock: Seguridad
> La recuperación de contraseña se rige por las recomendaciones de OWASP es decir:
> * Devuelve un mensaje coherente tanto para las cuentas existentes como para las inexistentes.
> * El sistema tiene un tiempo necesario para el mensaje de respuesta del usuario sea uniforme.
> * Se utiliza un canal lateral para comunicar el método para restablecer su contraseña.
> * Se utilizan Tokens únicos y generados aleatoriamente.
#### :bookmark_tabs: Flujo
[acá va imagen del diagrama de flujo de datos]
#### :pushpin: Referencias
* https://cheatsheetseries.owasp.org/cheatsheets/Forgot_Password_Cheat_Sheet.html
Usuario
--
#### Metodo
> GET
#### Request
> * TipoIdentificador: int (constante)
> * Identificador: string
#### Response
> OK
>>HttpStatus :200 OK
>>Titulo
>>Mensaje
>>Token
>>TipoEnvio [{nombre: string, codigo: int}]
> NOK
>>HttpStatus :404 Not Found
>>Titulo: No encontrado
>>Mensaje: No encontrado
#### Use Case
```sequence
Usuario No Autenticado->Sistema: ValidarLlave
Sistema-->Usuario No Autenticado: Enviar Token
```
#### :bulb: Criterios
> * Debe validar usuario por tipo de identificador.
> * Si usuario existe, se debe retornar los tipo de envío disponibles para el usuario.
> * Se debe generar y almacenar token único que identifique el proceso de recuperación de contraseña y al usuario.
#### :pushpin: Puntos a considerar
> **Se debe revisar en conjunto el ingresar también el recaptcha validándolo por el lado server. Pasándolo también por el request**
ObtenerCodigo
--
#### Metodo
> GET
#### Request
> * Token: string
> * TipoEnvio: int (constante)
#### Response
> OK
>>HttpStatus : 200 OK
>>Titulo
>>Mensaje
>>FechaLimte
> NOK
>>HttpStatus : 400 Bad Request
>>Titulo: Error de envío
>>Mensaje: No se pudo enviar correo electrónico o SMS
#### Use Case
```sequence
Front->Sistema: Request
Sistema->Sistema: Generar código
Sistema->HQBDOC EMAIL/SMS: Enviar código por el tipo
HQBDOC EMAIL/SMS-->Sistema: Respuesta Sistema Satelite
Sistema-->Front: Response
```
#### :bulb: Criterios
> * Validar token (existencia y caducación)
> * Generar y almacenar código alfanúmerico.
> * Enviar código según TipoEnvio.
> * Almacenar log de envío de código.
> * Mostrar en el Front el tiempo de validez de la solicitud. (enviar en response)
#### :pushpin: Puntos a considerar
ValidarCodigo
--
#### Metodo
> POST
#### Request
> * Token: string
> * Codigo: string
#### Response
> OK
>>HttpStatus :200 OK
>>Titulo: Código Válido.
>>Mensaje: El código ingresado es válido.
> NOK
>>HttpStatus :400 Bad Request
>>Titulo: Request incorrecto
>>Mensaje:
>>HttpStatus :404 Not Found
>>Titulo: Código no encontrado.
>>Mensaje: Código no encontrado o no pertenece a usuario.
>>HttpStatus :403 Forbidden
>>Titulo: Código Caducado.
>>Mensaje: Código se encuentra caducado. Reenvíe solicitud.
>>HttpStatus :403 Forbidden
>>Titulo: Intentos sobrepasados.
>>Mensaje: Ha sobrepasado la cantidad de intentos para validar el código. Espere la cuota de tiempo para realizar un nuevo intento.
#### Use Case
```sequence
Front-->Sistema: Petición
Note right of Sistema: Validar código en DB y cantidad de intentos realizados.
Sistema-->Front: Envio respuesta
```
#### Puntos a considerar
>
ActualizarContrasena
--
#### Metodo
> PATCH
#### Request
> * Token: string
> * Codigo: string
#### Response
> OK
>>HttpStatus :200 OK
>>Titulo: Contraseña cambiada.
>>Mensaje: Se con ingresado es válido.
> NOK
>>HttpStatus :400 Bad Request
>>Titulo: Request incorrecto
>>Mensaje:
>>HttpStatus :403 Forbidden
>>Titulo: Contraseña no pudo ser cambiada.
>>Mensaje: [varia segun la regla de contraseña que tenga para el cliente]
#### Use Case
```sequence
Front-->Sistema: Petición
Note right of Sistema: Validar token y que la constraseña cumpla con reglas de contraseñas.
Sistema-->Front: Cambio de contraseña
```