Mengautentikasi ke sumber daya Azure dari aplikasi Python yang dihosting secara lokal

Aplikasi yang dihosting di luar Azure (misalnya lokal atau di pusat data pihak ketiga) harus menggunakan perwakilan layanan aplikasi untuk mengautentikasi ke Azure saat mengakses sumber daya Azure. Objek perwakilan layanan aplikasi dibuat menggunakan proses pendaftaran aplikasi di Azure. Saat perwakilan layanan aplikasi dibuat, ID klien dan rahasia klien akan dibuat untuk aplikasi Anda. ID klien, rahasia klien, dan ID penyewa Anda kemudian disimpan dalam variabel lingkungan sehingga dapat digunakan oleh Azure SDK untuk Python untuk mengautentikasi aplikasi Anda ke Azure pada runtime.

Pendaftaran aplikasi yang berbeda harus dibuat untuk setiap lingkungan tempat aplikasi dihosting. Ini memungkinkan izin sumber daya khusus lingkungan dikonfigurasi untuk setiap perwakilan layanan dan memastikan bahwa aplikasi yang disebarkan ke satu lingkungan tidak berbicara dengan sumber daya Azure yang merupakan bagian dari lingkungan lain.

1 - Mendaftarkan aplikasi di Azure

Aplikasi dapat didaftarkan dengan Azure menggunakan portal Microsoft Azure atau Azure CLI.

az ad sp create-for-rbac --name <app-name>

Output perintah akan mirip dengan yang berikut ini. Catat nilai-nilai ini atau biarkan jendela ini terbuka karena Anda akan memerlukan nilai-nilai ini di langkah berikutnya dan tidak akan dapat melihat nilai kata sandi (rahasia klien) lagi.

{
  "appId": "00000000-0000-0000-0000-000000000000",
  "displayName": "msdocs-python-sdk-auth-prod",
  "password": "abcdefghijklmnopqrstuvwxyz",
  "tenant": "33333333-3333-3333-3333-333333333333"
}

2 - Menetapkan peran ke perwakilan layanan aplikasi

Selanjutnya, Anda perlu menentukan peran (izin) apa yang dibutuhkan aplikasi Anda pada sumber daya apa dan menetapkan peran tersebut ke aplikasi Anda. Peran dapat diberi peran di sumber daya, grup sumber daya, atau cakupan langganan. Contoh ini menunjukkan cara menetapkan peran untuk perwakilan layanan di cakupan grup sumber daya karena sebagian besar aplikasi mengelompokkan semua sumber daya Azure mereka ke dalam satu grup sumber daya.

Perwakilan layanan diberi peran di Azure menggunakan perintah az role assignment create.

az role assignment create --assignee {appId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

Untuk mendapatkan nama peran yang dapat ditetapkan oleh perwakilan layanan, gunakan perintah az role definition list.

az role definition list \
    --query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
    --output table

Misalnya, untuk mengizinkan perwakilan layanan dengan appId 00000000-0000-0000-0000-000000000000 baca, tulis, dan hapus akses ke kontainer blob Azure Storage dan data di semua akun penyimpanan dalam grup sumber daya msdocs-python-sdk-auth-example dalam langganan dengan ID 11111111-1111-1111-1111-111111111111, Anda akan menetapkan perwakilan layanan aplikasi ke peran Kontributor Data Blob Penyimpanan menggunakan perintah berikut.

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"

Untuk informasi tentang menetapkan izin di tingkat sumber daya atau langganan menggunakan Azure CLI, lihat artikel Menetapkan peran Azure menggunakan Azure CLI.

3 - Mengonfigurasi variabel lingkungan untuk aplikasi

Anda harus mengatur AZURE_CLIENT_IDvariabel lingkungan , AZURE_TENANT_ID, dan AZURE_CLIENT_SECRET untuk proses yang menjalankan aplikasi Python Anda untuk membuat kredensial perwakilan layanan aplikasi tersedia untuk aplikasi Anda saat runtime. Objek DefaultAzureCredential mencari informasi perwakilan layanan dalam variabel lingkungan ini.

Saat menggunakan Gunicorn untuk menjalankan aplikasi web Python di lingkungan server UNIX, variabel lingkungan untuk aplikasi dapat ditentukan dengan menggunakan EnvironmentFile direktif dalam file seperti yang gunicorn.server ditunjukkan di bawah ini.

[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

File yang ditentukan dalam direktif harus berisi daftar variabel lingkungan dengan nilainya seperti yang EnvironmentFile ditunjukkan di bawah ini.

AZURE_CLIENT_ID=<value>
AZURE_TENANT_ID=<value>
AZURE_CLIENT_SECRET=<value>

4 - Menerapkan DefaultAzureCredential di aplikasi Anda

Untuk mengautentikasi objek klien Azure SDK ke Azure, aplikasi Anda harus menggunakan DefaultAzureCredential kelas dari azure.identity paket.

Mulailah dengan menambahkan paket azure.identity ke aplikasi Anda.

pip install azure-identity

Selanjutnya, untuk kode Python apa pun yang membuat objek klien Azure SDK di aplikasi, Anda harus:

  1. DefaultAzureCredential Impor kelas dari azure.identity modul.
  2. Buat objek DefaultAzureCredential.
  3. Teruskan DefaultAzureCredential objek ke konstruktor objek klien Azure SDK.

Contoh ini ditampilkan di segmen kode berikut.

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)

Ketika kode di atas membuat instans DefaultAzureCredentialAZURE_TENANT_IDobjek, DefaultAzureCredential membaca variabel lingkungan , , AZURE_CLIENT_IDdan AZURE_CLIENT_SECRET untuk informasi perwakilan layanan aplikasi untuk terhubung ke Azure.