Skip to main content

Securización de una API con webMethods API Gateway v10.3

1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (2 votos, promedio: 4,00 de 5)
Cargando…

Introducción.

En este artículo voy a mostrar como securizar un API a través del protocolo OAuth 2, haciendo uso del grant type Authorization Code.

Para securizar el API, en este caso he utilizado el API Gateway de Software AG v10.3 en su versión On-Premise, aunque se puede utilizar también la versión Cloud que ofrece Software AG en softwareag.cloud. Destaco que en este caso utilizaremos el API Gateway tanto de servidor de autorización como de servidor de recursos, pero se podría utilizar otro servidor de autorización como OKTA  o ORY Hydra como alternativa Open Source.

La API que se utilizará en los ejemplos es la “famosa” Petstore y para testear tanto el flujo OAuth como el funcionamiento de la API he generado una pequeña aplicación en nodejs, dicha aplicación consta de un formulario donde se pueden introducir los valores necesarios para ejecutar el flujo de OAuth2 (Authorization Code) así como en la parte inferior se mostrarán los datos obtenidos y un pequeño formulario para testear la API utilizando el token obtenido. El código de la aplicación está disponible en el siguiente link

Sobre OAuth2 y Authorization code.

En este artículo no pretendo explicar detalladamente el funcionamiento de OAuth2, sus componentes y cada uno de los grant types que ofrece. Para ello ya existen multitud de artículos en blogs y por otro lado también podemos consultar su documentación oficial aqui. Tan sólo hablaré del grant type Authorization Code ya que es el flujo más completo que posee OAuth2 y nos vale para hacernos una idea de cómo funciona OAuth y como se implementaría sobre una API a través del Gateway de Software AG.

En la siguiente imagen se detalla el flujo que seguirá nuestra aplicación de ejemplo una vez creada y securizada la API en el gateway.

Sin entrar en detalles de cada paso seguido y los parámetros que se envían en cada llamada (lo veremos más adelante), el flujo comenzaría cuando un usuario por medio de nuestra aplicación ejemplo, quiere invocar a la API PetStore a través del Gateway. Si realiza una llamada con un token no válido o directamente sin token, obtendrá un error 401 informándole que no está autorizado.

Para obtener el token, primero se realizará una llamada al servidor de autorización (recurso /authorize) donde el servidor nos mostrará una pantalla para introducir nuestras credenciales y en caso de ser correctas, nos mostrará otra pantalla adicional para permitir o denegar el acceso a los recursos solicitados en la petición. En caso de permitir el acceso, el servidor de autorización devolverá un código (code) mediante el cual la aplicación podrá solicitar el token definitivo (Bearer Token) de nuevo al servidor de autorización (recurso /GetAccessToken) para ya finalmente con este token poder realizar peticiones a la API PetStore.

Creación de la API en el Gateway de Software AG.

Para crear la API Importaremos los datos desde petstore, para ello seleccionamos “Import API from URL” con los valores de la imagen:

Una vez creada vamos a la pestaña “Policies” y seleccionando el modo edición, nos permitirá añadir la política “Identify & Authorize Application”: Para ello hacemos clic en “Identify & Authorize Application” dentro de la sección “Identify & Access” y seleccionamos en las opciones de “Identification Type”: “OAuth2 Token”.

Aprovechamos que estamos editando el API para habilitar https, para ello en la sección “Transport”, hacemos clic en “Enable HTTP / HTTPS”, habilitamos el protocolo HTTPS y salvamos:

Creación de los scopes:

Resulta interesante definir unos scopes para más tarde comprobar que solo tendremos acceso a los métodos mapeados a los scopes OAuth deseados. En este caso se van a definir unos scopes en función de las entidades que se manejan en la API destino (PetStore). También se podrían crear scopes en función del nivel de acceso a la API, por ejemplo, un scope para los métodos GET y otro para los PUT y POST.

Para definir los scopes vamos a la pestaña “Scopes” y hacemos click en “+ Add scope”

Completamos el nombre y descripción del scope:

Seleccionamos en este caso todos los recursos relacionados con la entidad /pet y salvamos:

Repetimos lo mismo para el resto de scopes:

 

A su vez tenemos que crear los scopes en el servidor de autenticación. Para ello accedemos a “Administration” –> Pestaña Security y hacemos clic en local:

En el apartado “OAuth scopes” añadimos los scopes a utilizar en el servidor de autorización local y pulsamos Update:

Una vez creados los scopes necesarios en el servidor de autorización, tenemos que mapear dichos scopes contra los scopes definidos en la API, para ello vamos al menú principal del Gateway y en la opción “OAuth/OpenID scopes”:

Seleccionamos por un lado el scope del servidor de authorización (Authorization server scope):

 

Y por otro lado el scope de la API:

Repetimos la operación con el resto de scopes…

Creación de la Aplicación.

El siguiente paso será crear y registrar la aplicación en el API Gateway. Para ello vamos a “Applications” y hacemos clic en “+ Create application”:

Completamos los datos de la sección “Basic Information”:

En la sección “APIs”, buscamos la API creada en los pasos anteriores y la seleccionamos.

 

En la Sección “Authentication” hacemos clic en “+ Create strategy”:

Completamos los campos de la strategy con los datos de la imagen y hacemos clic en “Add”:

Para los tokens seleccionaremos unos tiempos de vida relativamente cortos para así poder realizar pruebas de refresco de token.

Destacar la importancia del campo Redirect URIs, donde debemos añadir las URLs desde donde estamos invocando a las operaciones authorization y getAccessToken.

Testeo del API:

Para realizar el test, debemos completar los siguientes campos del formulario de la aplicación de ejemplo:

 

  • Grant Type: Grant Type de OAuth2 a testear, en este caso será Authorization Code.
  • CallBack URL: URL que el servidor de autorización utilizará para redirigir al cliente una vez ha sido autorizado. En este caso que tenemos la aplicación de ejemplo desplegada en local: https://localhost:8089/oauth-form.html
  • Auth URL: URL correspondiente al endpoint que se utilizará en el servidor de autorizacion para obtener el authorization code. En este caso tenemos desplegado el servidor de autorización una máquina virtual. https://localhost:8866/invoke/pub.apigateway.oauth2/authorize
  • Access Token URL: URL correspondiente al endpoint que se utilizará en el servidor de autorización para intercambiar el token. https://localhost:8866/invoke/pub.apigateway.oauth2/getToken
  • Client ID: Identificador de cliente generado por el servidor de autorización en el momento del registro de la aplicación. (2365c051-89e7-4325-a523-f759cef8fe23)
  • Client Secret: Contraseña de cliente generada por el servidor de autorización en el momento del registro de la aplicación. (245db806-f498-4c1b-b508-3794088117d8)
  • Scopes: Scope OAuth2 que indica a que recursos tenemos acceso. Para esta petición solicitaremos acceso al scope petScopeDemo.
  • State: Cadena única utilizada para mantener el estado entre la petición y la respuesta del servidor de autorización. Por ejemplo “132456789”
  • Client Authentication: Tipo de Authenticación utilizada al hacer a petición a la API. Enviaremos el Bearer token en el Header Basic Authorization.

El primer paso sería obtener el código de autorización mediante el botón “Authorize”:

Con los datos del formulario la aplicación realizará la siguiente petición:

POST
https://localhost:8866/invoke/pub.apigateway.oauth2/authorize?client_id=2365c051-89e7-4325-a523-f759cef8fe23&redirect_uri=https://localhost:8089/oauth-form.html&response_type=code&scope=petScopeDemo&state=132456879

Se abrirá una ventana para introducir nuestras credenciales y que aprobemos el acceso desde el servidor de autorización al scope introducido en el formulario superior:

Si todo va bien y Aprobamos, podemos ver el Code en el campo correspondiente (Code OAuth2 server):

Ahora ya podremos solicitar el Access token mediante el botón “Request OAuth Token”, la aplicación realizará una llamada Ajax y obtendrá el token:

POST

https://localhost:8866/invoke/pub.apigateway.oauth2/getAccessToken?code=66207c1f0f684d4ead4d7bf2537072f2&grant_type=authorization_code&redirect_uri=https://localhost:8089/oauth-form.html&scope=petScopeDemo&state=132456879

Headers:
Accept: application/json
Content-Type: application/json
Authorization: Basic MjM2NWMwNTEtODllNy00MzI1LWE1MjMtZjc1OWNlZjhmZTIzOjI0NWRiODA2LWY0OTgtNGMxYi1iNTA4LTM3OTQwODgxMTdkOA==

Una vez obtenido el token, podremos invocar a la API utilizando el token correspondiente:

En caso de que el token expire podemos solicitar otro, para ello pulsamos el botón “Refresh Token” y se nos abrirá una ventana para introducir el endpoint del servidor de autorización correspondiente al recurso para refrescar el token. (https://localhost:8866/invoke/pub.apigateway.oauth2/refreshAccessToken):

Pulsamos “Get New token” y obtendremos un nuevo token para realizar nuevas peticiones.

 

Diego Manso

Diego Manso

Consultor de Integración - API Management

Diego Manso ha escrito 1 entradas


Diego Manso

Diego Manso

Consultor de Integración - API Management

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.