Llamar a APIs protegidas con Azure AD con Azure CLI

Esta semana he estado haciendo algunas pruebas con APIs protegidas con Azure AD y por agilidad he utilizado como cliente Azure CLI ūüėÉ, en lugar de crearme uno a medida. Esto me facilita la tarea ya que puedo despreocuparme de la obtenci√≥n del token que necesito para ejecutar exitosamente las llamadas. En este art√≠culo te cuento c√≥mo lo he usado.

Crear un service principal que represente al cliente

La buena práctica es que tengas mínimo dos aplicaciones registradas en Azure AD: una que represente a la API y otra al cliente que la va a consumir, en este caso Azure CLI:

# az login with an admin
az login
# Create a service principal
az ad sp create-for-rbac --skip-assignment --name "api-client-using-azure-cli" > auth.json
# Get the client id
CLIENT_ID=$(jq -r '.appId' auth.json)
PASSWORD=$(jq -r '.password' auth.json)
TENANT_ID=$(jq -r '.tenant' auth.json)

Nota: en este código estoy usando la herramienta jq.

Asignar los permisos sobre la API protegida con Azure AD

Para que este cliente pueda obtener el token, con la audiencia adecuada, necesitamos asignarle permisos sobre esta. Para ello puedes utilizar estos comandos:

# Configure permissions for the service principal
API_CLIENT_ID=$(az ad sp list --query "[?appDisplayName=='ProtectedWebAPI'].appId" --all | jq -r '.[0]')
DO_ALL_SCOPE=$(az ad sp list --query "[?appDisplayName=='ProtectedWebAPI'].{permissions:oauth2Permissions}[0].permissions[?value=='do.all'].{id: id, value: value, adminConsentDisplayName: adminConsentDisplayName, adminConsentDescription: adminConsentDescription}[0]" --all | jq -r '.id')
# Assign permissions
az ad app permission add --id $CLIENT_ID --api $API_CLIENT_ID --api-permissions $DO_ALL_SCOPE=Scope

O también puedes hacerlo desde el portal de Azure a través del apartado API Permissions.

API Permissions de una app registrada a Azure AD

Hacer llamadas a la API usando Azure CLI

Para poder hacer las llamadas a través de Azure CLI necesitas volver a iniciar sesión, pero utilizando ahora el service principal que tiene permisos para hacerlo:

# Login using service principal
az login --service-principal -u $CLIENT_ID -p $PASSWORD --tenant $TENANT_ID --allow-no-subscriptions

Esto te permitir√° simular exactamente los permisos que necesitar√° un cliente para poder invocar las llamadas que necesita. Ahora ya puedes realizar las llamadas utilizando el subcomando az rest:

# Make the call
az rest --method get --uri <URI_YOU_WANT_TO_MAKE_THE_CALL> --resource <THE_AUDIENCE_YOU_NEED>

Por ejemplo, si quisiera llamar a una API en la URL https://protectedwebapidemo.azurewebsites.net/weatherforecast, con la audiencia api://c94cb8b9-fa83-4303-a38d-5eadabc28d0f sería de la siguiente forma:

# Make the call
az rest --method get --uri https://protectedwebapidemo.azurewebsites.net/weatherforecast --resource api://c94cb8b9-fa83-4303-a38d-5eadabc28d0f

Gracias a este comando nos podemos despreocupar de la obtención del token para la audiencia que corresponda, facilitando la pruebas sobre tus APIs protegidas en Azure AD.

¬°Saludos!