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.

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!