En este segundo artículo, veremos como enriquecer el proyecto que teníamos, implementando documentación dentro de OpenApi, en este caso swagger, conectándonos a una base de datos con entityFramework y añadiendo autenticación a nuestro Api. Veremos en cada uno de los siguientes apartados como ir añadiendo als distintas funcionalidades a nuestro proyecto.
EntityFrameworkCore 6 y minimap API
Vamos a añadir EntityFramework para tener una base de datos y tener datos que explotar para poder hacer un CRUD completo. En este acaso, como es un proyecto para realizar pruebas, añadiremos EntityFramework inMemory, que nos permite de forma sencilla tener una base de datos para hacer unas pequeñas pruebas. Lo primero añadimos el nuget necesario:
Install-Package Microsoft.EntityFrameworkCore.InMemory -Version 6.0.1
Una vez Instalado el paquete, generaremos dentro de nuestro Program.cs el DbContext necesario para un pequeño modelo de datos (particulas elementales).
ParticlesDB
Este DbContext es la representacion de un modelo de datos, que basicamente es:
Particles
Una vez añadido el contexto en la inicialización de los servicios.
Ya tendríamos disponible el DbSet de Particles para operar sobre el.
Adicionalmente, como estamos en un entorno de pruebas, podríamos iniciar la base datos en el arranque de nuestro api, para ello, necesitamos una clase extra en la que deleguemos la población de la misma, y llamarla antes del arranque de la aplicación.
Documentación OpenApi
Ya teníamos el SwaggerUI disponible. Ahora vamos a modificar nuestros endpoint para tener un CRUD que ataque a nuestra base de datos recién creada. Podemos indicar mediante la extensión de
Microsoft.AspNetCore.Http, lo que aceptan y producen nuestros endpoints para que swagger nos muestre la documentación.
Nos quedarían los siguientes endpoints:
Y tendríamos la siguiente salida en el explorador.
Inyección de dependencias
Ahora para más claridad, podemos hacer uso de un servicio en el que vamos a delegar el manejo de nuestro contexto. Para ello es tan sencillo como crear una interfaz e implementar los métodos para la obtención, creación, actualización y borrado de nuestras entidades.
Después inyectaremos este servicio y se lo pasaremos como parámetro al mapeo de nuestras rutas.
Es importante señalar que como dentro del Servicio, hacemos uso del DbContext, que está inyectado como Scope, el propio servicio, debe ser inyectado de igual manera.
Autenticación y Autorización
Por último, podemos añadir seguridad a nuestro api. Para ello haremos uso de un IdentityServer para generar nuestro token de acceso para un apiClient.
Creamos un proyecto de IdentityServer, el mas sencillo posible lo podemos crear gracias a las plantillas, de la siguiente manera: dotnet new isempty -n IdentityServer
Una vez que esté corriendo el servidor, podemos pedir un token de acceso con la configuración por defecto, con la llamada
Y recibiremos una respuesta del tipo:
Una vez que tengamos esta parte funcionando, vamos a enriquecer nuestro API para añadirle seguridad, lo primero, deberemos instalar el nuget Microsoft.AspNetCore.Authentication.JwtBearer y añadir lo siguiente a nuestro Program:\
Ahora podemos indicar a nuestros endpoint que estan publicados bajo una capa de seguridad, y necesitan de autenticacion para ser llamados de cualquiera de las formas siguientes
O bien
De esta forma, si hacemos la petición a nuestro endpoint, recibiremos un 401
Para ver que todo funciona, por último hacemos una llamada a nuestro servicio, añadiendo el token de autorización para comprobar que contesta correctamente «`console curl –location –request GET ‘https://localhost:7113/particles’ \ –header ‘Authorization: Bearer {access_token}’ «` Obteniendo una respuesta correcta:
Si quieres ver o descargar el código correspondiente a este artículo, está disponible en el siguiente enlace minimal-apis-sample.
Siente libre de hacer cualquier aportación al mismo.