Aplicación de la seguridad a las API's

Aprenda a integrar el servicio de identidad de Keycloak en las API para el control de acceso en el microservicio desarrollado con la plataforma Devprime. Keycloak es compatible con OpenID Connect / OAuth 2.0 / JWT en la protección de páginas web y 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:

  1. Cree una instancia de Keycloak siguiendo los procedimientos indicados.
  2. Instale la CLI de Devprime.
  3. 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

  1. Una vez completado, puede ejecutar el microservicio. Luego termine.
    .\run.ps1 o ./run.sh (Linux, macOS)

  2. 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.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
  "Devprime_Web": {
    "url": "https://localhost:5003;http://localhost:5002",
    "enable": "true",
    "enableswagger": "true",
    "PostSuccess": "201",
    "PostFailure": "500",
    "GetSuccess": "200",
    "GetFailure": "500",
    "PatchSuccess": "200",
    "PatchFailure": "500",
    "PutSuccess": "200",
    "PutFailure": "500",
    "DeleteSuccess": "200",
    "DeleteFailure": "500",
    "EnableWebLegacy": "false",
    "EnableStaticFiles": "true",
    "ShowHttpRequests": "false"
  },
  1. 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
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  "Devprime_Security": {
    "Enable": "true",
    "Identity": {
      "Enable": "true",
      "Type": "keycloak",
      "Domain": "http://localhost:8080/realms/devprime",
      "ClientId": "Your-app-name",
      "ClientSecret": "Your-secret",
      "EnableOIDC": "false",
      "Audience":"Your-app-name",
      "AuthenticationScheme": "OpenIdConnect",
      "LogoutUri": "http://localhost:8080/auth/realms/devprime/protocol/
      openid-connect/logout?redirect_uri=https%3A%2F%2Flocalhost%3A5001",
      "Scopes": "openid;email"
    }

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))));
    }
  1. Vuelva a ejecutar el microservicio y abra la URL https://localhost:5003

  2. Inicie sesión en swagger e intente realizar un “GET”

  3. Dado que la seguridad está activa, la respuesta será un 401 que indica falta de permiso
    401 Seguridad

  4. 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🚀

Última modificación April 11, 2024 (cc33f7e6)