¿Cómo podemos ayudarte?
< Todos los temas
Imprimir

Protegiendo API con JWT.

Antes de leer el artículo, por favor, lea aquí

Código disponible GitHub.

Introducción y primeros pasos

Una vez concluido los pasos descritos en el artículo de Creando API con ASP.NET estamos en condiciones de proteger el acceso a la API. (Para tener un mejor entendimiento de que es JWT puedes leer el artículo AUTENTICACIÓN JWT, ¿QUÉ ES Y CUÁNDO USARLA?)

El primer paso es agregar el paquete que agregara todo lo necesario para trabajar con JWT en nuestra aplicación. En la consola del administrador de paquetes escribimos:

El orden de pasos es el siguiente:

  • Debemos especificar una clave para el cifrado de la firma.
  • Agregar en el middleware el servicio de JWT Bearer.
  • Crear el modelo del Usuario
  • Crear modelos de request y response
  • Crear el controlador que realizará todo el proceso de autenticación
  • Restringiendo acceso a las acciones y controladores

Clave para el cifrado de la firma

La clave para el cifrado de la firma la guardaremos en el fichero appsettings.json que se encuentra en la raíz del proyecto:

Configurar el Middleware

El próximo paso es configurar el middleware, en el fichero Program.cs en la raíz del proyecto agregamos las siguientes líneas, antes var app = builder.Build();

Modelo Usuario

En la carpeta Datos creamos una clase:

Agregamos este modelo al contexto para generar la tabla en nuestra base de datos. En el fichero ApplicationDbContext.cs dentro de la misma carpeta agregamos la propiedad:

En la consola de administrador de paquetes escribimos:

Si usamos el Explorador de objetos de SQL Server podemos verificar que la tabla ha sido creada con éxito:

Modelos de request y response

Por una elección personal, nos gusta crear estos modelos para organizar los formatos de los pedidos y las respuestas de las API.

En el caso de la autenticación crearemos dos Request y dos Responses(para registro y para login)

En la carpeta Datos creamos 4 clases: LoginRequest.cs, RegisterRequest.cs, LoginResponse.cs y RegisterResponse.cs

Creando controlador de autenticación

En la carpeta Controllers creamos un nuevo controlador API llamado AuthController.cs.

Declaramos dos variables que inicializaremos en el constructor, estas nos permitirán leer, acceso al contexto para consultar la base de datos y poder leer el fichero appsettings.json para tener acceso a la clave para firmar el token.

Este controlador tendrá dos métodos auxiliares a las acciones, CrearToken y GetSha1

Ahora solo nos queda crear dos acciones, una para autenticar y otra para registrar(En el caso de este ejemplo solo mostraremos estas acciones):

Autenticar:

Registro:

El proceso de autenticación esta listo, vamos a probarlo, corremos la aplicación con f5

Usaremos el software Postman. Puedes descargarlo de aquí: https://www.postman.com/downloads/

Primero registramos nuestro primer usuario, ponemos la URL en el Postman y especificamos que el método es POST, en el Body, marcamos la opción RAW y el formato JSON. y en ese formato escribimos los datos del usuario a crear y presionamos Send

Si todo sale bien recibiremos la respuesta con el Id del usuario creado y el nombre:

Probemos ahora la autenticación de ese usuario. En el Postman ponemos la URL referente a la autenticación, en el Body marcamos Raw y formato JSON y en ese formato ponemos los datos de la autenticación y presionamos Send

El Postman nos devuelve:

Restringir acceso

Antes probemos crear una persona, usando las acciones creadas en el articulo Creando una API en ASP.NET.

En el Postman, la URL: https://localhost:<puerto>/api/personas/ usando el método Post y en Body seleccionamos Raw con formato JSON:

La respuesta (señalada en el cuadro) es 201 Created.

Para restringir la creación de personas a usuarios No Autenticados, solo basta con poner la etiqueta [Authorize] justo antes de la acción en el controlador:

Ahora si probamos crear una nueva persona:

ya la respuesta es 401 Unauthorized.

Para acceder a la acción de crear una nueva persona en Authorization escogemos el tipo Bearer Token, pegamos el token que devolvió la autenticación:

Damos Send:

Ya tenemos nuevamente respuesta 201 Created.

Conclusiones

La etiqueta [Authorize] va a actuar en dependencia del nivel que se ponga, por ejemplo si se pone encima del enunciado del controlador, restringirá el acceso a todas las acciones a usuarios autenticados:

Para, dentro de un controlador restringido completamente poner una acción de acceso sin autenticar, agregamos encima de la acción la etiqueta [AllowAnonymous]. Ejemplo el controlador de AuthController.cs debe ser restringido excepto el método Autenticar.

El acceso mediante roles y el consumo de la API con la autenticación lo haremos en otro artículo.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Tabla de contenidos