9.4 Creando nuestro servicio de login y generar el token
Vamos a crear nuestro servicio de login en el cual además de validar al usuario vamos a regresar el token. Según que tanta seguridad necesite tu aplicación puedes darle un tiempo de vida más largo o más corto. En mi caso como es una aplicación sencilla que no maneja datos muy confidenciales le dejaré un tiempo de 15 días. Para aplicaciones que manejen información más confidencial similar a un banco puedes darle tiempo de una hora. También si quieres probar que los token caducan y el servicio para refrescar el token puedes darle un tiempo más corto para pruebas de 2 minutos, solamente para que no debas esperar a que expiren los tokens.
Vamos a crear una carpeta llamada DTO (Data Transfer Object) en esta carpeta vamos a guardar archivos que necesitamos para nuestros servicios pero que no pertenecen a ninguna tabla, por ejemplo vamos a crear una clase llamada TokenDTO para regresar los datos del Token cuando un usuario inicia sesión correctamente.
Agregamos otro clase llamada LoginDTO el cual va a incluir los datos que necesitamos para realizar el login, para empezar solo pediremos usuario y contraseña.
Crear clases para Generar y el código para Refrescar el Token
En nuestra carpeta Core agregamos una clase Token el cual tendrá 2 métodos uno para generar el Token y otro para generar el método para refrescar el token.
Como generar el token
La clase que genera el Token de parte de .NET es JwtSecurityToken, en nuestro método GenerarToken recibe como parámetros la lista de claims adicionales que deseas regresar en tu token.
Para generar el token vamos a utilizar una llave simétrica la cual nos servirá para hacer el hash al token, similar a como lo hicimos con el password del usuario con el salt, para firmar utilizaremos el algoritmo SHA-256 con la función SingningCredentials, e indicamos que expira en 15 días, agregamos también quien es el issuer y quien es la audiencia.
Por último con el método JwtSecurityTokenHandler() generamos la cadena que contiene el token.
Como refrescar el Token
Debido a que nuestro token expira después de 15 días ya no será válido, algunos de los servicios REST incluyen un método para refrescar el token, por seguridad si tu token nunca expira y un hacker obtiene tu token podría acceder siempre a tus datos a menos que desactives tu usuario, para refrescar el token, al momento de que realizas el login se suele regresar una cadena aleatoria, esta cadena aleatoria se debe enviar como parámetro junto con tu token para validar que es un token válido.
Creamos una función RefrescarToken el cual nos va a generar la cadena aleatoria para refrescar el token, para eso obtenemos un número random, luego lo convertimos a una cadena base 64, nuestro método para refrescar token será por medio GET, el convertir a base64 nos genera caracteres con &,?,/,+,- los cuales indican parámetros en nuestros métodos GET, remplazaremos estos caracteres por números
Crear el método para el login.
Agregamos una clase RolDAO el cual nos regresará los roles que tiene el usuario que se envía como parámetro
En nuestro archivo UsuarioDAO agregamos el método para el LoginAsync.
Primero realizamos las siguientes validaciones:
Que el usuario exista
Que el password del usuario coincida con el que está guardado, para esto al password enviado por el usuario le agregamos el salt (adicional1)
Que el usuario se encuentre activo
Si cumple todas las condiciones agregamos:
El claim con el id del usuario. Utilizaré el claim de tipo Sid
El claim con los roles del usuario.
El token generado
El código para refrescar el token
Agregamos los mensajes de error a nuestros archivos de recursos de mensajes.
Agregamos un nuevo controller (UsuariosController) para los servicios de los usuarios puedes ver el siguiente link para recordar cómo crear un nuevo controller.
En el método Post ponemos entre paréntesis la palabra Login para que el login se acceda mediante la siguiente url:
Agregamos entre [] la palabra AllowAnonymous el cual le indica al servicio que permite el acceso a este servicio no requiere token, cualquiera puede acceder a este servicio.
Para acceder a los servicios con Swagger
Da clic en el botón Authorize que se encuentra arriba a la derecha.
Teclea la palabra Bearer seguido de un espacio y el token generado por el login
Dar clic en el botón Authorize de la ventana popup
Ahora puedes consultar cualquier servicio y te regresará la información
Para probar los servicios con Postman
Da clic en la pestaña Authorization
Del lado izquierdo en Type Selecciona Bearer Token
En Token escribe el token generado por el método Login
Last updated