Aplicación de la seguridad a las API's
Durante este escenario, usaremos el adaptador de seguridad de la pila de Devprime para habilitar la configuración de seguridad y le recomendamos que implemente Aplicación de seguridad web.
Para avanzar en este escenario, es esencial tener una instancia de Keycloak y seguir los pasos que se indican a continuación:
- Cree una instancia de Keycloak siguiendo los procedimientos indicados.
- Instale la CLI de Devprime.
- Creación de un microservicio para su uso en la demostración ms-sec-order
dp new ms-order-payment --state mongodb --stream rabbitmq --marketplace payment --init
dp new ms-order-delivery –state mongoDB –stream rabbitmq –marketplace delivery –init
-
Una vez completado, puede ejecutar el microservicio. Luego termine.
.\run.ps1 o ./run.sh (Linux, macOS) -
Cambiar el puerto de microservicio predeterminado
Ahora editaremos el archivo appsettings.json disponible en la carpeta ms-payment/src/App para configurar el adaptador web y, a continuación, el adaptador de seguridad. Asigne el valor del parámetro url para evitar conflictos de puertos.
|
|
- Abra el archivo de configuración e incluya en el adaptador de seguridad los parámetros de Keycloak obtenidos en el elemento 1 de este tutorial cambiando los elementos “Domain, ClientID / ClientSecret / LogoutUri / Audience”
code ./src/App/appsettings.json
|
|
Después de completar esta etapa, el control de seguridad de acceso a la API ya está configurado. Busque el archivo Payment.cs en la carpeta ms-payment/src/Adapters/Web/ para configurar la restricción de acceso a una ruta en la API. En el siguiente ejemplo, lo aplicaremos al elemento “app. MapPost /v1/payment”.
public override void Endpoints(WebApplication app)
{
//Automatically returns 404 when no result
app.MapGet("/v1/payment" ,[Authorize] async (HttpContext http, IPaymentService Service, int? limit, int? offset, string ordering, string ascdesc, string filter) => await Dp(http).Pipeline(() => Service.GetAll(new Application.Services.Payment.Model.Payment(limit, offset, ordering, ascdesc, filter)), 404));
//Automatically returns 404 when no result
app.MapGet("/v1/payment/{id}", async (HttpContext http, IPaymentService Service, Guid id) => await Dp(http).Pipeline(() => Service.Get(new Application.Services.Payment.Model.Payment(id)), 404));
app.MapPost("/v1/payment", async (HttpContext http, IPaymentService Service, Devprime.Web.Models.Payment.Payment command) => await Dp(http).Pipeline(() => Service.Add(command.ToApplication())));
app.MapPut("/v1/payment", async (HttpContext http, IPaymentService Service, Application.Services.Payment.Model.Payment command) => await Dp(http).Pipeline(() => Service.Update(command)));
app.MapDelete("/v1/payment/{id}", async (HttpContext http, IPaymentService Service, Guid id) => await Dp(http).Pipeline(() => Service.Delete(new Application.Services.Payment.Model.Payment(id))));
}
-
Vuelva a ejecutar el microservicio y abra la URL https://localhost:5003
-
Inicie sesión en swagger e intente realizar un “GET”
-
Dado que la seguridad está activa, la respuesta será un 401 que indica falta de permiso
-
También puede realizar la misma prueba usando curl
curl https://localhost:5003/v1/payment -i
HTTP/1.1 401 Unauthorized
Content-Length: 0
Date: Fri, 20 Jan 2023 23:49:26 GMT
Server: Kestrel
WWW-Authenticate: Bearer
Próximos pasos:
Ha asegurado el acceso a una API de microservicios mediante Keycloak.
Felicidades🚀