Uwierzytelnianie w zasobach platformy Azure z aplikacji języka Python hostowanych lokalnie
Aplikacje hostowane poza platformą Azure (na przykład lokalnie lub w centrum danych innej firmy) powinny używać jednostki usługi aplikacji do uwierzytelniania na platformie Azure podczas uzyskiwania dostępu do zasobów platformy Azure. Obiekty jednostki usługi aplikacji są tworzone przy użyciu procesu rejestracji aplikacji na platformie Azure. Po utworzeniu jednostki usługi aplikacji zostanie wygenerowany identyfikator klienta i klucz tajny klienta dla aplikacji. Identyfikator klienta, klucz tajny klienta i identyfikator dzierżawy są następnie przechowywane w zmiennych środowiskowych, dzięki czemu mogą być używane przez zestaw Azure SDK dla języka Python do uwierzytelniania aplikacji na platformie Azure w czasie wykonywania.
Dla każdego środowiska hostowanego w aplikacji należy utworzyć inną rejestrację aplikacji. Umożliwia to skonfigurowanie uprawnień określonych zasobów środowiska dla każdej jednostki usługi i gwarantuje, że aplikacja wdrożona w jednym środowisku nie rozmawia z zasobami platformy Azure, które są częścią innego środowiska.
1 — Rejestrowanie aplikacji na platformie Azure
Aplikację można zarejestrować na platformie Azure przy użyciu witryny Azure Portal lub interfejsu wiersza polecenia platformy Azure.
az ad sp create-for-rbac --name <app-name>
Dane wyjściowe polecenia będą podobne do poniższych. Zanotuj te wartości lub pozostaw to okno otwarte, ponieważ te wartości będą potrzebne w następnych krokach i nie będą mogły ponownie wyświetlić wartości hasła (klucza tajnego klienta).
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2 — Przypisywanie ról do jednostki usługi aplikacji
Następnie należy określić, jakich ról (uprawnień) potrzebuje twoja aplikacja na temat zasobów i przypisać te role do aplikacji. Role mogą być przypisywane do roli w zakresie zasobu, grupy zasobów lub subskrypcji. W tym przykładzie pokazano, jak przypisać role dla jednostki usługi w zakresie grupy zasobów, ponieważ większość aplikacji grupuje wszystkie zasoby platformy Azure w jedną grupę zasobów.
Jednostka usługi ma przypisaną rolę na platformie Azure przy użyciu polecenia az role assignment create .
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
Aby uzyskać nazwy ról, do których można przypisać jednostkę usługi, użyj polecenia az role definition list .
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
Aby na przykład zezwolić jednostce usługi z identyfikatorem appId 00001111-aaaa-2222-bbbb-3333cccc4444
odczytu, zapisu i usuwania do kontenerów obiektów blob usługi Azure Storage i danych we wszystkich kontach magazynu w grupie zasobów msdocs-python-sdk-auth-example w subskrypcji o identyfikatorze aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, należy przypisać jednostkę usługi aplikacji do roli Współautor danych obiektu blob usługi Storage przy użyciu następującego polecenia.
az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
--role "Storage Blob Data Contributor"
Aby uzyskać informacje na temat przypisywania uprawnień na poziomie zasobu lub subskrypcji przy użyciu interfejsu wiersza polecenia platformy Azure, zobacz artykuł Przypisywanie ról platformy Azure przy użyciu interfejsu wiersza polecenia platformy Azure.
3 — Konfigurowanie zmiennych środowiskowych dla aplikacji
Należy ustawić AZURE_CLIENT_ID
zmienne środowiskowe , AZURE_TENANT_ID
i AZURE_CLIENT_SECRET
dla procesu, który uruchamia aplikację w języku Python, aby udostępnić poświadczenia jednostki usługi aplikacji dla aplikacji w czasie wykonywania. Obiekt DefaultAzureCredential
szuka informacji o jednostce usługi w tych zmiennych środowiskowych.
Korzystając z narzędzia Gunicorn do uruchamiania aplikacji internetowych języka Python w środowisku serwera z systemem UNIX, zmienne środowiskowe dla aplikacji można określić przy użyciu EnvironmentFile
dyrektywy w gunicorn.server
pliku, jak pokazano poniżej.
[Unit]
Description=gunicorn daemon
After=network.target
[Service]
User=www-user
Group=www-data
WorkingDirectory=/path/to/python-app
EnvironmentFile=/path/to/python-app/py-env/app-environment-variables
ExecStart=/path/to/python-app/py-env/gunicorn --config config.py wsgi:app
[Install]
WantedBy=multi-user.target
Plik określony w EnvironmentFile
dyrektywie powinien zawierać listę zmiennych środowiskowych z ich wartościami, jak pokazano poniżej.
AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>
4 — Implementowanie wartości domyślnejAzureCredential w aplikacji
Aby uwierzytelnić obiekty klienta zestawu Azure SDK na platformie Azure, aplikacja powinna używać DefaultAzureCredential
klasy z azure.identity
pakietu.
Zacznij od dodania pakietu azure.identity do aplikacji.
pip install azure-identity
Następnie w przypadku dowolnego kodu w języku Python, który tworzy obiekt klienta zestawu Azure SDK w aplikacji, należy wykonać następujące czynności:
- Zaimportuj klasę
DefaultAzureCredential
z modułuazure.identity
. - Utwórz
DefaultAzureCredential
obiekt. - Przekaż obiekt do konstruktora
DefaultAzureCredential
obiektu klienta zestawu Azure SDK.
Przykład jest pokazany w następującym segmencie kodu.
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)
Gdy powyższy kod tworzy wystąpienie DefaultAzureCredential
obiektu, DefaultAzureCredential
odczytuje zmienne AZURE_TENANT_ID
środowiskowe , AZURE_CLIENT_ID
i AZURE_CLIENT_SECRET
informacje o jednostce usługi aplikacji w celu nawiązania połączenia z platformą Azure za pomocą polecenia .