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:
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
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
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
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
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 “+”.
Figura 6. Configuración de Gravitee Access Management
2. En nuestro caso de uso, por facilidad, seleccionaremos “Backend to Backend”.
Figura 7. Backend to Backend
3. Completamos los datos relativos a nuestra nueva aplicación.
Figura 8. Completar datos relativos
4. Una vez creada, obtendremos información de como hacer uso de nuestra 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'
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”.
Figura 11. Nuevo Recurso
2. Dentro del menú “Design”, en la parte superior derecha, seleccionamos “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.
Figura 12. Configuración del resource
4. No olvidar salvar la 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.
Figura 14. Crear plan
6. Dentro del menú “Plans”, crearemos un nuevo Plan asociado a nuestra API.
Figura 15. Plan asociado a API
7. Completaremos los datos relativos a nuestro nuevo 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”.
Figura 17. Seleccionamos como tipo “OAuth2”
9. Configurar los datos relativos a las restricciones de consumo.
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”.
Figura 19. Crear nueva aplicación
12. Completaremos los datos de nuestra nueva aplicación.
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.
Figura 21. Configuración Security
14. Podemos saltar la suscripción a nuestra API, la crearemos en un paso posterior.
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”.
Figura 23. Crear aplicación dentro de la plataforma
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.
Figura 25. Suscripción
17. Seleccionamos el plan tipo OAuth2 creado en los pasos anteriores.
Figura 26. Crear suscripción
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:
Figura 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.
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!