Uwierzytelnianie w zasobach platformy Azure z poziomu aplikacji języka Go 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 główne serwisu aplikacji są tworzone za pomocą rejestracji w usłudze Azure. Po utworzeniu elementu usługi aplikacji dla Twojej aplikacji zostanie wygenerowany identyfikator klienta oraz klucz tajny klienta. 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 Go 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 głównej 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. Rola może być przypisana do 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
na odczyt, zapis i usuwanie danych w kontenerach obiektów blob usługi Azure Storage we wszystkich kontach magazynowych w grupie zasobów msdocs-go-sdk-auth-example w subskrypcji o identyfikatorze aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
, należy przypisać jednostkę usługi aplikacji do roli Kontrybutora Danych Blob 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-go-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ć zmienne środowiskowe AZURE_CLIENT_ID
, AZURE_TENANT_ID
i AZURE_CLIENT_SECRET
dla procesu uruchamiającego aplikację Go, aby poświadczenia jednostki usługi były dostępne dla aplikacji w czasie jej działania. Obiekt DefaultAzureCredential
szuka informacji o głównej usłudze w tych zmiennych środowiskowych.
Nazwa zmiennej | Wartość |
---|---|
AZURE_CLIENT_ID |
Identyfikator aplikacji jednostki usługi platformy Azure |
AZURE_TENANT_ID |
Identyfikator dzierżawy aplikacji Microsoft Entra |
AZURE_CLIENT_SECRET |
Hasło głównej usługi platformy Azure |
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"
4 — Implementacja DefaultAzureCredential w aplikacji
Aby uwierzytelnić obiekty klienta zestawu Azure SDK na platformie Azure, aplikacja powinna używać typu DefaultAzureCredential
z pakietu azidentity
.
Zacznij od dodania pakietu azidentity
do aplikacji.
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
Następnie, dla każdego kodu w języku Go, który tworzy klienta Azure SDK w twojej aplikacji, należy wykonać następujące kroki:
- Zaimportuj pakiet
azidentity
. - Utwórz wystąpienie typu
DefaultAzureCredential
. - Przekaż wystąpienie typu
DefaultAzureCredential
do konstruktora klienta zestawu Azure SDK.
Przykład jest pokazany w następującym segmencie kodu.
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
const (
account = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
containerName = "sample-container"
blobName = "sample-blob"
sampleFile = "path/to/sample/file"
)
func main() {
// create a credential
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// TODO: handle error
}
// create a client for the specified storage account
client, err := azblob.NewClient(account, cred, nil)
if err != nil {
// TODO: handle error
}
// TODO: perform some action with the azblob Client
// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}
Gdy powyższy kod tworzy wystąpienie DefaultAzureCredential
, wtedy DefaultAzureCredential
odczytuje zmienne środowiskowe AZURE_TENANT_ID
, AZURE_CLIENT_ID
i AZURE_CLIENT_SECRET
zawierające informacje o głównym użytkowniku usługi aplikacji, aby połączyć się z platformą Azure.