Ir al contenido principal

¿Cómo podemos securizar nuestras APIs en Gravitee API Management mediante el estándar OAuth 2.0?

En este artículo nos centraremos en las capacidades del producto Gravitee API Management para securizar nuestras APIs mediante el estándar OAuth 2.0 desde un punto de vista práctico.

Seguiremos el siguiente índice:

1. ¿Qué es OAuth 2.0?

OAuth2 es un estándar abierto para la autorización segura de la comunicación entre nuestras APIs que permite a las aplicaciones obtener un acceso limitado a los recursos de una API, delegando las tareas de autenticación a un recurso propietario (o con una relación de confianza) de la cuenta de usuario. 

Podéis encontrar más información acerca de este protocolo en el siguiente enlace: OAuth 2.0: Autenticación, seguridad y usabilidad de API – Chakray-

2. Arquitectura para poder implementar OAuth 2.0 dentro de Gravitee API Management

Para poder implementar OAuth 2.0 dentro de Gravitee API Management será necesario disponer de un OAuth2 Authorization Server, encargado de generar y validar los tokens de acceso sobre los que se securizarán nuestras APIs. Para ello, existen varias opciones:

  • Generic OAuth2 Authorization Server
  • Gravitee Access Management, solución Open Source con licencia Apache 2.0 y soporte Enterprise proporcionada por Gravitee.io
  • Custom Adapter, como por ejemplo el disponible para Keycloak

En nuestro caso concreto nos centraremos en la solución proporcionada por Gravitee.io, Gravitee Access Management. 

En el siguiente enlace https://github.com/ChakrayES/docker-compose-gravitee-am-singlegw podéis encontrar el código fuente para arrancar la solución de Access Management.

También haremos uso del laboratorio de Gravitee API Management que creamos en el siguiente artículo del que disponemos del código fuente en el siguiente enlace https://github.com/ChakrayES/docker-compose-gravitee-api-singlegw (branch with-gravitee-am).

El flujo de autenticación que veremos en el siguiente artículo será el siguiente:

Flujo de autenticación

Figura 1. Flujo de autenticación

3. Inicio del laboratorio para securizar nuestras APIs mediante el estándar OAuth 2.0 desde un punto de vista práctico

Antes de arrancar los servicios de nuestro laboratorio, debemos añadir las siguientes líneas al fichero de DNS local de la máquina. En caso de entornos Linux o Mac, la configuración sería la siguiente:

/etc/hosts
# Gravitee API Management
127.0.0.1   portainer.demo.chakray.internal api.demo.chakray.internal mgt-api.demo.chakray.internal mgt-ui.demo.chakray.internal portal-ui.demo.chakray.internal

# Gravitee Access Management
127.0.0.1   am-gw.demo.chakray.internal am-api.demo.chakray.internal am-webui.demo.chakray.internal

También existe la opción de registrar los correspondientes registros dentro del Servidor DNS local, en caso de disponer de esta funcionalidad en la LAN.

1.Procedemos con el arranque del laboratorio de Gravitee Access Management mediante la ejecución del siguiente comando en el directorio raíz del proyecto:

docker-compose-gravitee-am-singlegw % docker-compose up -d

2. Podemos comprobar el estado de los servicios con el siguiente comando:

docker-compose-gravitee-am-singlegw % docker-compose ps

Comprobar estado del servicio

Figura 2. Comprobar estado del servicio

3. Podemos visualizar los logs de los servicios con el siguiente comando:

docker-compose-gravitee-am-singlegw % docker-compose logs -f –tail 2

Logs de los servicios

Figura 3. Log de los servicios

4. Procedemos con el arranque del laboratorio de Gravitee API Management mediante la ejecución del siguiente comando en el directorio raíz del proyecto:

docker-compose-gravitee-api-singlegw % docker-compose up -d

5. Podemos comprobar el estado de los servicios con el siguiente comando:

docker-compose-gravitee-api-singlegw % docker-compose ps

Comprobar estado de servicios

Figura 4. Comprobar estado de servicios

6. Podemos visualizar los logs de los servicios con el siguiente comando:

docker-compose-gravitee-api-singlegw % docker-compose logs -f –tail 2

Visualizar log de los servicios

Figura 5. Visualizar log de los servicios

7. Podemos acceder a la consola de Gravitee API Management en la dirección http://mgt-ui.demo.chakray.internal/ (usuario admin/admin).

8. Podemos acceder a la consola de Gravitee Access Management en la dirección http://am-webui.demo.chakray.internal:90/ (usuario admin/adminadmin).

4. Proteger nuestra Gravitee API Management con OAuth2

Tomaremos como base la API creada en el siguiente artículo. El objetivo será crear un nuevo plan, esta vez bajo el protocolo OAuth2.

4.1 Configuración de Gravitee Access Management

1.El primer paso será crear una Aplicación dentro de la consola de administración de Gravitee Access Management. Para ello accederemos al menú de “Applications”, pulsando el icono de “+”.

Configuración de Gravitee Access Management

Figura 6. Configuración de Gravitee Access Management

2. En nuestro caso de uso, por facilidad, seleccionaremos “Backend to Backend”.

Backend to Backend

Figura 7. Backend to Backend

3. Completamos los datos relativos a nuestra nueva aplicación.

Completar datos relativos

Figura 8. Completar datos relativos

4. Una vez creada, obtendremos información de como hacer uso de nuestra nueva aplicación.

Uso de la nueva aplicación

Figura 9. Uso de la nueva aplicación

5. En nuestro caso, podemos generar un token de acceso haciendo uso de la siguiente instrucción:

curl -X POST \
  http://am-gw.demo.chakray.internal:90/chakraylab/oauth/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic NjkyOWFlOWEtZDZmYy00N2FiLWE5YWUtOWFkNmZjOTdhYmYyOjNFTUs4M0ZWR2NPZExrQmprLUFPd2poYnNhcnN3SUp3ZlRTa0FpYmpHUzA=' \
  -d 'grant_type=client_credentials'

Generar Token de acceso

Figura 10. Generar Token de acceso

4.2 Configuración de Gravitee API Management

El siguiente paso será crear un nuevo plan en nuestra API del tipo OAuth2 conectado a la aplicación que acabamos de crear en Gravitee Access Management.

1.En primer lugar, registramos nuestro Gravitee Access Management como nuevo recurso para nuestra API. Para ello, accederemos a la consola de administración de Gravitee APi Management. Seleccionamos la API “My REST Countries” y accedemos al menú “Design”.

Nuevo recurso

Figura 11. Nuevo Recurso

2. Dentro del menú “Design”, en la parte superior derecha, seleccionamos “Resources”.

Resources

Figura 12. Resources

3. Seleccionamos “Gravitee AM Authorization Server”. Completamos los datos relativos a nuestro Gravitee Access Management. Especial cuidado con el security domain, debe coincidir con el creado dentro de Gravitee Access Management.

Configuración del resource

Figura 12. Configuración del resource

4. No olvidar salvar la configuración!!

Guardar configuración

Figura 13. Guardar configuración

 

5. El siguiente paso será crear un plan de tipo Ouath2 dentro de nuestra API. Para crear nuestro nuevo plan, accederemos a nuestra API “My REST Countries” desde la consola de administración de Gravitee API Management.

Crear plan

Figura 14. Crear plan

6. Dentro del menú “Plans”, crearemos un nuevo Plan asociado a nuestra API.

Plan asociado a API

Figura 15. Plan asociado a API

7. Completaremos los datos relativos a nuestro nuevo plan.

Completar plan

Figura 16. Completar plan

8. Seleccionamos como tipo “OAuth2” y damos un nombre al recurso, que debe coincidir con el nombre del recurso dado de alta en en el paso anterior. En nuestro caso, “gravitee-am”.

Seleccionamos como tipo “OAuth2”Figura 17. Seleccionamos como tipo “OAuth2”

9. Configurar los datos relativos a las restricciones de consumo.

Datos relativos

Figura 18. Datos relativos

10. Por último, relativo al plan, no olvidar publicarlo para que pueda estar disponible.

11. El siguiente paso será crear una nueva aplicación, asociada a nuestra aplicación de Gravitee Access Management. Para ello, accederemos a la consola de administración, menú “Applications”.

Crear nueva aplicación

Figura 19. Crear nueva aplicación

12. Completaremos los datos de nuestra nueva aplicación.

Completar datos

Figura 20. Completar datos

13. En la configuración de Security, el client_id debe coincidir con el correspondiente a la aplicación creada en Gravitee Access Management. En caso contrario, no serán aceptados los tokens de acceso por parte de nuestra suscripción. 

Configuración Security

Figura 21. Configuración Security

14. Podemos saltar la suscripción a nuestra API, la crearemos en un paso posterior.

Saltar suscripción

Figura 22. Saltar suscripción

15. Una vez completado el flujo de creación, crearemos la aplicación dentro de la plataforma mediante la opción de “Create the application”.

Crear aplicación dentro de la plataforma

Figura 23. Crear aplicación dentro de la plataforma

Aplicación creada

Figura 24. Aplicación creada

16. El siguiente paso será suscribirnos a nuestra nueva aplicación. Para ello, desde la consola de administración, en la definición de nuestra API, crearemos una nueva suscripción a nuestra nueva aplicación.

Suscripción

Figura 25. Suscripción

17. Seleccionamos el plan tipo OAuth2 creado en los pasos anteriores.

Crear suscripción

Figura 26. Crear suscripción

Suscripción finalizada

Figura 27. Suscripción finalizada

18. Para consumir nuestro API, en primer lugar solicitamos un token de acceso a nuestro Resource Server. En nuestro caso utilizaremos un grant type Client Credentials.

curl -X POST \
  http://am-gw.demo.chakray.internal:90/chakraylab/oauth/token \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -H 'Authorization: Basic NjkyOWFlOWEtZDZmYy00N2FiLWE5YWUtOWFkNmZjOTdhYmYyOjNFTUs4M0ZWR2NPZExrQmprLUFPd2poYnNhcnN3SUp3ZlRTa0FpYmpHUzA=' \
  -d 'grant_type=client_credentials'

19. Este será nuestro token de acceso:

Token de accesoFigura 28. Token de acceso

20. Una vez obtenemos un token de acceso, consumimos nuestro API con dicho token mediante la siguiente instrucción:

curl \
  -H 'Authorization: Bearer eyJraWQiOiJkZWZhdWx0IiwidHlwIjoiSldUIiwiYWxnIjoiUlMyNTYifQ.eyJzdWIiOiI2OTI5YWU5YS1kNmZjLTQ3YWItYTlhZS05YWQ2ZmM5N2FiZjIiLCJhdWQiOiI2OTI5YWU5YS1kNmZjLTQ3YWItYTlhZS05YWQ2ZmM5N2FiZjIiLCJkb21haW4iOiJjZTg3ZjdkNy00OGEwLTQyMjQtODdmNy1kNzQ4YTAxMjI0ZDAiLCJpc3MiOiJodHRwOlwvXC9hbS1ndy5kZW1vLmNoYWtyYXkuaW50ZXJuYWw6OTBcL2NoYWtyYXlsYWJcL29pZGMiLCJleHAiOjE2NzE3OTY1MDIsImlhdCI6MTY3MTc4OTMwMiwianRpIjoiMUtzNE9aeklOWkdWLVBIQ1NPOFdLWWFpelRQdk5MdE5OWmxSbE9jZkdqYyJ9.QQun3iAbITo8rM0yYr8jjOdBGgYnCRo48eur08fF7EnpsmQBLN1e7AaITNfOPPk1yqYRuCTNp7U6fCLv4eOWmr7UBW3o5VmH5zkjn1uq43pb_suIfSwqFaPiJeq8ehVqRJUFwQ3y_cbfMBKsEGi8UdJP-U0r2PCxrE1Cuf7ItsbhUYWZzzjQbguqh3fo8Sdoc5gWseqj2lOBJwSk_d4DkFW_cckag8fEp9Dz670urjBxuSjdibBGtuISpEA1HiXBxvsq4encUoyraVRQA_cu00FrIM6chJbWxFDpspynHNwcMj8Tfpz_w-EynA6cf5b2mkP_yoctMOCKQXT6HezS0w' \
  "http://api.demo.chakray.internal/myrestcountries/alpha/es" | jq

21. Podemos visualizar el consumo de nuestra API desde el cuadro de mando de Analytics de nuestra API.

Analytics de nuestra API

Figura 29. Analytics de nuestra API

En este cuadro de mando podemos observar como las peticiones han sido consumidas bajo el plan OAuth2 creado dentro de este artículo.

5. Chakray y Gravitee.io

Chakray, como Partner Oficial de Gravitee.io, dispone del conocimiento y las herramientas necesarias para  abordar cualquier proyecto de API Management, brindando la tranquilidad de contar con un equipo especializado en su despliegue, desarrollo y posterior mantenimiento, así como con el apoyo conjunto con el fabricante para los entornos Enterprise. Estaremos encantados de oír su caso de uso y analizar cuál es la mejor estrategia de APIficación para implementar la capa de API Management en su organización. ¡Contáctanos hoy mismo!