top of page
  • Foto del escritorAlejandro Caravantes Molina

Securizar las llamadas a flujos de Power Automate expuestos por API Management


Vamos con la segunda parte del post donde hablabamos como podemos exponer flujos de Power Automate cuyo desencadenador es un trigger HTTP, a través de Azure API Management. En esta ocasión vamos a securizar las llamadas a API Management para añadir una capa de seguridad y autenticar las request que se reciban. Ya te adelanto que toda la autenticación la vamos a delegar, como no podía ser de otra forma en API Management.


El flujo de la autenticación por si no lo conoces, es muy simple tal y como puedes ver en la imagen: un cliente solicita un token JWT a Azure AD mediante credenciales (también podríamos configurar la autenticación mediante certificado), si Azure AD autoriza al solicitante correctamente le devuelve un token que el cliente deberá incluir en el header de la petición a API Management. API Management comprueba que el token recibido en la petición es un token válido y si la comprobación es correcta envía la petición al backend. En caso contrario rechaza la solicitud y lógicamente el backend ni se entera que ha pasado algo.


Manos a la obra.

Lo primero que necesitamos hacer es registrar dos aplicaciones en Azure AD que representen tanto el cliente que va a invocar a la API como a la propia API. Para ello dirígete al portal de Azure, selecciona Azure Active Directory y App Registrations. A continuación registra dos aplicaciones. En mi caso las he llamado APIManagementApp y APIManagementClient, como puedes ver en la imagen inferior.


El segundo paso, si vamos a autenticarnos utilizando la especificación OAuth 2.0 como es este caso, necesitamos actualizar el manifiesto de la aplicación que representa a la API para que trabaje con esta especificación. Para ello selecciona la aplicación que representa la API, y dirígete a la opción Manifest. Modifica la propiedad accesstokenAcceptedVersion para que tenga el valor 2.


Ahora selecciona Expose an API y donde puedes leer Application ID Uri, selecciona Establecer. Acto seguido haz clic en Add a Scope y establece el scope que va a exponer nuestra API. En mi caso lo que configurado como puedes ver en la imagen.

Vamos a continuar ahora configurando la aplicación cliente, creando un secreto. Para ello selecciona esta aplicación, en mi caso APIManagementClient, y selecciona Certificados y Secretos. Crea un nuevo secreto y copia el valor del secreto generado ahora, que luego ya no lo podrás copiar 😉.


Por último, ve a la opción Permisos de API para otorgar los permisos necesarios a la aplicación que representa la API. Selecciona Add a Permission y busca la aplicación que representa a nuestra API desde la pestaña APIs my organization uses. Selecciona la aplicación, el scope y haz clic en Add Permissions. Por ultimo selecciona Grant admin consent para confirmar los permisos.

No lo he dicho hasta ahora, pero como siempre durante todo este proceso ve apuntando los identificadores de ambas aplicaciones, el identificador del tenant sobre el que estés trabajando y el secreto generado.


Ya hemos terminado la configuración de las aplicaciones, asi que vamos ahora a configurar nuestro recurso API Management. Para ello accede al propio recurso y selecciona la API con la que estés trabajando. Edita la Inbound Policy e incluye la sección de código que aparece a continuación:

<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
            <openid-config url="https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration" />
            <audiences>
                <audience>{APIManagementApp ID}</audience>
            </audiences>
        </validate-jwt>

En mi caso queda de la siguiente forma:


¡Ya está! Vamos ahora a probar lo que hemos hecho. Para ello abre Postman y crea una nueva request o utiliza la que tenías del post anterior. Fíjate que si intentas ejecutar la request tal y como la teníamos ya configurada, obtenemos el siguiente error:


Para autenticar la llamada correctamente, ve a la pestaña Authorization y en las opciones de configuración establece lo siguiente:

  • Grant Type: Client Credentials

  • Client ID: el identificador de la aplicación registrada en Azure AD que representa al cliente.

  • Client Secret: el valor del secreto que has generado en la aplicación cliente.

  • Scope: el scope que has creado en la aplicación registrada en Azure AD que representa a la propia API, añadiendo un /.default al final

Haz clic en el botón Get New Access Token y si todo está bien configurado aparecerá un token en la pantalla que podrás incluir en tu request haciendo click en Use Token. Fíjate en la pestaña Headers y verás que se ha incluido una nueva entrada con el nombre Authorization y el token generado como valor. Envia la request y... voilà


Antes de finalizar, me gustaría comentar algo que me parece muy importante y es que el nivel de granularidad en la seguridad que podemos configurar va mucho mas allá de lo que estamos haciendo en este post. Digamos que lo que estamos viendo en esta entrada es el primer escalón, pero es muy importante saber que podemos llegar a configurar roles de seguridad, que se incluyen en el token de autenticación generado y que podemos utilizar para controlar las acciones para las que un determinado cliente tiene permisos.


Y como siempre..... ¡Gracias por tu tiempo!. ¡Hasta la siguiente!

Comments


bottom of page