softland_1

En este Camp del TechClub Tajamar vino Luis Felipe Gil Lamaignere, director del área de Tecnología en Softland Capital Humano para hablarnos sobre cómo crearnos una API REST mediante .NET Core en Visual Studio 2017.

Luis dirige el departamento de I+D+i, se encarga de definir arquitecturas y procesos para las aplicaciones, planificar y estructurar la integración con el resto de las aplicaciones del grupo.

La agenda del día consistió en estructurar un API REST con .NET Core, desarrollar el modelo, agregar seguridad con JWT al proyecto, y terminar desplegándolo en Azure. La guía con todos los pasos necesarios para desarrollar este proyecto se encuentra en el siguiente enlace, junto con la presentación utilizada.

 

INTRODUCCIÓN

Según la documentación de Microsoft, .NET Core es un marco multiplataforma de código abierto y de alto rendimiento que tiene como finalidad compilar modernas aplicaciones conectadas a Internet y basadas en la nube.

.NET Core es una implementación de .NET Standard de código abierto, multiplataforma y modular. Está orientado al rendimiento, y también es rápido y ligero. Contiene muchas APIs de .NET Framework, además de compartir componentes de entorno en tiempo de ejecución, compilador y los paquetes NuGet.

softland_2

 

CREACIÓN DE LA API

Los pasos necesarios para la creación y configuración de la API, además del código, están en el Lab del Camp compartido tanto al comienzo como al final de esta entrada.

Creamos un nuevo proyecto en Visual Studio 2017 del tipo ASP.NET Core Web Application, marcando también la opción API dentro de las plantillas disponibles en la creación del proyecto.

A grandes rasgos, Luis nos comentó las características más relevantes de un proyecto de este tipo:

  • Los ajustes del proyecto se guardan en formato json dentro del fichero appsettings.json. Aquí podremos definir la cadena de conexión que utilizaremos de nuestra base de datos creada en Azure y las opciones de la seguridad JWT.
  • La clase Program.cs se encara de arrancar el servidor integrado del proyecto, además de trabajar con la clase Startup.cs. Por defecto Visual Studio nos configura el servidor del proyecto en modo prueba, por lo que no aceptará peticiones externas. Si queremos poner esta API en producción, deberemos modificar el método BuildWebHost.
  • cs se encarga de la configuración e inicialización de nuestro software. Podemos ir registrando servicios en el método ConfigureServices, mientras que en Configure se inyectan en los controladores
  • Dentro de la carpeta Models podremos definir el modelo que utilizaremos, los controladores en la carpeta Controllers, y la seguridad JWT en la carpeta Options.

En este Camp se hablaba mucho de las similitudes entre .NET Core y .NET Framework, entre ellas los paquetes NuGet. Esto nos facilita enormemente el desarrollar una API, ya que con agregar en nuestro proyecto el paquete Microsoft.AspNetCore.All, incluimos con un sólo click todas las librerías de EntityFramework que nos son necesarias.

softland_3

 

MODELO

El punto de partida en nuestra API será la creación del modelo. En la carpeta Models incluiremos las clases que serán administradas por nuestra base de datos de Azure (Producto y Tienda entre otras, ya que nuestra API tratará sobre una tienda online).

Con las clases ya definidas, creamos nuestro contexto de datos. Como requisito previo a este Camp, era necesario tener una base de datos creada en un servidor de Azure. Configuramos el contexto añadiendo y desarrollando el método OnModelCreating para definir las relaciones entre las tablas. Terminamos añadiendo una clase que inicialice las tablas en nuestra base de datos con datos de muestra, que hasta este momento estaba completamente vacía. Es imprescindible incluir manualmente la cadena de conexión en formato json en nuestro appsettings.json.

Para crear nuestra base de datos a partir del modelo, instalamos el paquete NuGet Microsoft.EntityFrameworkCore.Tools.DotNet, y desde cmd borramos antiguas migraciones. Nos creamos una nueva migración y es el momento de actualizar nuestra base de datos. Si ahora accedemos a ella desde SQL Server Management Studio comprobaremos que ahora disponemos de tablas.

Todavía nuestra API no es funcional, ya que para ello debemos configurar los controladores. Crearemos diferentes IActionResult en nuestro controlador para definir las acciones GET, GET(id), POST, PUT y DELETE.

Con todo configurado, hicimos pruebas en Postman para comprobar que Luis tenía razón; la creación de APIs con .NET Core es un proceso sencillo, al igual que en .NET Framework.

 

AGREGANDO SEGURIDAD CON JWT

Tradicionalmente, la autenticación se almacenaba en una sesión en el servidor. La sesión contenía la información del usuario, y mediante una base de datos se registraba y gestionaba el acceso al sistema. Esto podía repercutir en el rendimiento y en la escalabilidad de nuestra aplicación.

Mediante la autenticación con Tokens o JSON Web Tokens (JWT), no necesitamos que nuestro servidor almacene en una sesión nuestra información de usuario. Mediante una API REST se genera un token, o firma cifrada, que se almacena en cliente habilitando su acceso a la API. Esto soluciona los problemas de escalabilidad, ya que no necesitas desarrollar diferentes backends según el cliente que utilice nuestra aplicación.

softland_4

Ya en nuestro proyecto de Visual Studio, añadimos la clase Usuario a nuestro modelo, además de una clase que cifre nuestras contraseñas. Volvemos a realizar las migrations para que nuestra base de datos se actualice e incluya la tabla de Usuarios.

Nos quedaba crearnos una clase donde manejar las opciones de emisión de los tokens en la carpeta Options, además de agregar un nuevo controlador para autenticar a los usuarios y devolver los tokens que serán validados.

Con los datos que sean validados, creamos un Claim simple con la información del usuario, con el que después se creará el Token. Para que JWT sea funcional, terminamos de configurarlo en appsettings.json y en startup.cs.

Ahora tenemos todo listo. Volvemos a probar mediante Postman que nuestra API funciona perfectamente, haciendo antes un POST para insertar nuestro primer usuario.

Como curiosidad, en la página de JWT podemos probar en su debugger la información que contiene un TOKEN en concreto.

softland_5

 

DESPLIEGUE EN AZURE

Terminamos el Camp viendo cómo subir nuestra API en Azure, y para ello no tomamos el camino fácil mediante la opción de publicar que nos ofrece Visual Studio. Lo que hicimos fue subir nuestro proyecto a nuestra cuenta de GitHub, y desde el portal de Azure importarlo.

Para ello basta con copiar la dirección de nuestro repositorio de GitHub, vincularla con el proyecto y hacer el commit en la vista Team Explorer. Una vez que esté subido, entramos en nuestro perfil de Azure y nos creamos un nuevo App Service, y desde las opciones de implementación seleccionamos GitHub como origen.

Por fin tenemos nuestra API desarrollada en .NET Core funcionando completamente en Azure.

 

CONCLUSIÓN

Desarrollar una API en .NET Core no es un proceso tan complicado como pudiera parecer en un comienzo, si estás habituado a trabajar en .NET Framework. Además, la posibilidad de usar los mismos paquetes NuGet es una potente herramienta que nos facilita implementar la funcionalidad de nuestra API.

JWT nos ofrece una muy buena alternativa a la forma tradicional de agregar seguridad en un proyecto. Es un complemento perfecto para esta aplicación, ya que una API desarrollada en .NET Core y que utilice TOKENS como forma de autenticación, es una API funcional en cualquier cliente, fácilmente escalable y eficiente.

Hasta aquí el Camp de desarrollo de APIs en .NET Core. Desde TechClub Tajamar esperamos que los asistentes hayan encontrado interesante el evento, así como que este post os sirva de resumen de los aspectos más importantes del mismo.

Un saludo a todos, nos vemos en el siguiente Camp!

softland_6

 

 

 

Documentación del Camp:

Presentación

Laboratorio

 

Autor: José Ramón Landriz

Coordinador TechClub Tajamar. Alumno máster Microsoft MCSA Web Applications + Microsoft MCSD App Builder + Xamarin

Año académico: 2017-2018