Authentifier des applications Python auprès des services Azure pendant le développement local à l’aide de comptes de développeur
Lorsque les développeurs créent des applications cloud, ils déboguent et testent généralement les applications sur leur poste de travail local. Lorsqu’une application est exécutée sur la station de travail d’un développeur pendant le développement local, elle doit toujours s’authentifier auprès des services Azure utilisés par l’application. Cet article explique comment utiliser les informations d’identification Azure d’un développeur pour authentifier l’application auprès d’Azure pendant le développement local.
Pour qu'une application puisse s'authentifier auprès d'Azure pendant le développement local en utilisant les informations d'identification Azure du développeur, ce dernier doit être connecté à Azure depuis Azure CLI, Azure PowerShell ou Azure Developer CLI. Le SDK Azure pour Python est capable de détecter que le développeur est connecté depuis l'un de ces outils, puis d'obtenir les informations d'identification nécessaires depuis le cache d'informations d'identification pour authentifier l'application auprès d'Azure en tant qu'utilisateur connecté.
Cette approche est plus simple à configurer pour une équipe de développement, car elle tire parti des comptes Azure existants des développeurs. Toutefois, le compte d’un développeur aura probablement plus d’autorisations que celles requises par l’application, dépassant les autorisations que l’application exécutera en production. En guise d’alternative, vous pouvez créer des principaux de service d’application à utiliser pendant le développement local, qui peuvent être limités aux seuls besoins de l’application.
1 - Créez un groupe de sécurité Microsoft Entra pour le développement local
Comme il y a presque toujours plusieurs développeurs qui travaillent sur une application, il est recommandé de créer d'abord un groupe de sécurité Microsoft Entra pour encapsuler les rôles (permissions) dont l'application a besoin dans le développement local. Cette approche offre les avantages suivants.
- Chaque développeur est assuré d’avoir les mêmes rôles attribués, car les rôles sont attribués au niveau du groupe.
- Si un nouveau rôle est nécessaire pour l'application, il suffit de l'ajouter au groupe Microsoft Entra pour l'application.
- Si un nouveau développeur rejoint l'équipe, il suffit de l'ajouter au bon groupe Microsoft Entra pour qu'il obtienne les permissions nécessaires pour travailler sur l'application.
Si vous disposez d'un groupe de sécurité Microsoft Entra pour votre équipe de développement, vous pouvez l'utiliser. Sinon, suivez les étapes suivantes pour créer un groupe de sécurité Microsoft Entra.
La commande az ad group create permet de créer des groupes dans Microsoft Entra ID. Les paramètres --display-name
et --main-nickname
sont obligatoires. Le nom donné au groupe doit être basé sur le nom de l’application. Il est également utile d’inclure une expression telle que « local-dev » dans le nom du groupe pour indiquer l’objectif du groupe.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description "<group-description>"
Copiez la valeur de la propriété id
dans la sortie de la commande. Il s'agit de l'ID de l'objet pour le groupe. Vous en avez besoin dans les étapes ultérieures. Vous pouvez également utiliser la commande az ad group show pour récupérer cette propriété.
Pour ajouter des membres au groupe, vous avez besoin de l'ID d'objet de l'utilisateur Azure. Utilisez la liste az ad user pour répertorier les principaux de service disponibles. La --filter
commande de paramètre accepte les filtres de style OData et peut être utilisée pour filtrer la liste sur le nom d’affichage de l’utilisateur, comme indiqué. Ce paramètre --query
limite la sortie aux colonnes d’intérêt.
az ad user list \
--filter "startswith(displayName, 'Bob')" \
--query "[].{objectId:id, displayName:displayName}" \
--output table
La commande az ad group member add peut ensuite être utilisée pour ajouter des membres à des groupes.
az ad group member add \
--group <group-name> \
--member-id <object-id>
Remarque
Par défaut, la création de groupes de sécurité Microsoft Entra est limitée à certains rôles privilégiés dans un répertoire. Si vous ne parvenez pas à créer un groupe, contactez un(e) administrateur(-trice) pour votre annuaire. Si vous ne parvenez pas à ajouter des membres à un groupe existant, contactez le propriétaire du groupe ou un(e) administrateur(-trice) d’annuaire. Pour plus d’informations, consultez Gérer les groupes Microsoft Entra et l’appartenance à un groupe.
2 – Attribuer des rôles au groupe Microsoft Entra
Ensuite, vous devez déterminer les rôles (autorisations) dont votre application a besoin sur les ressources et affecter ces rôles à votre application. Dans cet exemple, les rôles seront attribués au groupe Microsoft Entra créé à l'étape 1. Les rôles peuvent être attribués au niveau d'une ressource, d'un groupe de ressources ou de l'étendue d'un abonnement. Cet exemple montre comment attribuer des rôles au niveau du groupe de ressources, car la plupart des applications regroupent toutes leurs ressources Azure dans un seul groupe de ressources.
Un utilisateur, un groupe ou un principal de service d'application se voit attribuer un rôle dans Azure à l'aide de la commande az role assignment create. Vous pouvez spécifier un groupe avec son ID d'objet.
az role assignment create --assignee <objectId> \
--scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
--role "<roleName>"
Pour obtenir les noms de rôles qui peuvent être attribués, utilisez la commande az role definition list.
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table
Par exemple, pour permettre aux membres d'un groupe dont l'ID d'objet est bbbbbbbb-1111-2222-3333-cccccccccccc
d'accéder en lecture, en écriture et en suppression aux conteneurs et données blob d'Azure Storage dans tous les comptes de stockage du groupe de ressources msdocs-python-sdk-auth-example dans l'abonnement dont l'ID est aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, vous attribuerez le rôle Contributeur de données blob de stockage au groupe à l'aide de la commande suivante.
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
--role "Storage Blob Data Contributor"
Pour plus d’informations sur l’attribution d’autorisations au niveau de la ressource ou de l’abonnement à l’aide d’Azure CLI, consultez l’article Attribuer des rôles Azure à l’aide d’Azure CLI.
3 - Connectez-vous à Azure à l'aide d'Azure CLI, Azure PowerShell, Azure Developer CLI ou dans un navigateur
Ouvrez un terminal sur votre station de travail de développeur et connectez-vous à Azure à partir d’Azure CLI.
az login
4 - Implémenter DefaultAzureCredential dans votre application
Pour authentifier les objets clients du SDK Azure auprès d'Azure, votre application doit utiliser la classe DefaultAzureCredential
du package azure.identity
. Dans ce scénario, DefaultAzureCredential
vérifie séquentiellement si le développeur s'est connecté à Azure à l'aide de la CLI d'Azure, d'Azure PowerShell ou de la CLI de développeur d'Azure. Si le développeur est connecté à Azure à l'aide de l'un de ces outils, les informations d'identification utilisées pour se connecter à l'outil seront utilisées par l'application pour s'authentifier auprès d'Azure.
Commencez par ajouter le package azure.identity à votre application.
pip install azure-identity
Ensuite, pour tout code Python qui crée un objet client Azure SDK dans votre application, vous devrez :
- Importez la classe
DefaultAzureCredential
du moduleazure.identity
. - Créez un objet
DefaultAzureCredential
. - Transmettez l'objet
DefaultAzureCredential
au constructeur de l'objet client du SDK Azure.
Un exemple de ces étapes est présenté dans le segment de code suivant.
from azure.identity import DefaultAzureCredential
from azure.storage.blob import BlobServiceClient
# Acquire a credential object
token_credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url="https://<my_account_name>.blob.core.windows.net",
credential=token_credential)