Algunos servicios incluyen la opción de refrescar tu token, por ejemplo si un hacker obtiene tu token ya sea porque esta rastreando las peticiones al servicio o mediante un mail falso, si das un tiempo corto de vida, por ejemplo 1 hora, si un hacker obtiene el token solo podría utilizarlo durante máximo una hora, también puedes agregar validaciones para poder desactivar un token a un usuario.
Como ya tenemos la función que nos da el código para refrescar el token, vamos a crear el servicio para refrescar el token, será mediante un método POST y va a recibir como parámetro el código para refrescar el token.
Primero en nuestra clase UsuarioAcceso le vamos a cambiar la longitud a 400 caracteres
Agregamos la migración y actualizamos la base de datos.
En nuestra carpeta DTO agregamos la clase RefreshTokenDTO el cual va a contener solamente el código para refrescar el token.
RefreshTokenDTO.cs
/// <summary>/// Clase para refrescar el token/// </summary>publicclassRefreshTokenDTO{ /// <summary> /// Código para refrescar el token /// </summary>publicstring RefreshToken { get; set; }}
Como para refrescar el token regresamos un nuevo Token, vamos a agregar una función para regresar el token, el cual vamos a utilizarlo para el login y para refrescar el token.
Agregamos una función para validar el Token, para esto en nuestra tabla UsuarioAcceso vamos a buscar el código para refrescar el token. En esta tabla UsuarioAcceso cada vez que un usuario realiza el login vamos a registrar algunos datos como el navegador, sistema operativo y ciudad desde la cual se conecta el usuario, por el momento solo vamos a guardar el token y el código para refrescar el token. Si todo es correcto generamos un nuevo token
UsuarioDAO.cs
publicboolValidarToken(string refreshToken,IConfiguration config){ //Buscamos el código para refrescar el token enviadovar tokenGuardado =contexto.UsuarioAcceso .FirstOrDefault(u =>u.RefreshToken== refreshToken &&u.Activo); //No existe marcamos errorif (tokenGuardado ==null)returnfalse; //Revisamos que el usuario este activovar usuario =contexto.Usuario.Find(tokenGuardado.UsuarioId);if (usuario ==null||!usuario.Activo)returnfalse; tokenDTO =GenerarToken(config,usuario.Id,usuario.Nombre);returntrue;}
Cambiamos nuestra función LoginAsync para guardar los datos del acceso del usuario en el login.