使用服務主體進行 Azure SDK for Go 驗證
在本教學課程中,您將使用 Azure SDK for Go,透過使用秘密或憑證向 Azure 服務主體進行驗證。
Azure 服務主體會定義 Microsoft Entra 租使用者中的存取原則和許可權。 啟用核心功能,例如在登入期間進行驗證,以及在資源存取期間進行授權。 拿掉使用個人帳戶存取 Azure 資源的需求。 Azure SDK for Go 的 Azure 身分識別 模組提供使用環境變數、秘密或憑證的服務主體向 Azure 進行驗證的便利方式
請遵循本教學課程,使用服務主體來建立 Azure SDK for Go 並進行驗證。
必要條件
- Azure 訂用帳戶:如果您沒有 Azure 訂用帳戶,請在開始前建立免費帳戶。
- Go 已安裝:1.18 版或 更新版本
1.設定您的環境
開始之前,請先建立新的資源群組和密鑰保存庫實例。
az group create --name go-on-azure --location eastus
az keyvault create --location eastus --name `<keyVaultName>` --resource-group go-on-azure
將取代 <keyVaultName>
為全域唯一名稱。 也請記 Id
下輸出中的 ,您將將其用於服務帳戶的範圍。
2.建立 Azure 服務主體
使用下列其中一種技術來建立 Azure 服務主體:
若要深入瞭解 Azure 服務主體,請參閱 服務主體物件。
選項 1:使用秘密建立 Azure 服務主體
執行下列命令來建立 Azure 服務主體。
az ad sp create-for-rbac --name `<servicePrincipalName>` --role Contributor --scope <resourceGroupId>
將和 <resourceGroupId>
取代<servicePrincipalName>
為適當的值。
請確定您複製 密碼 值 - 無法擷取。 如果您忘記密碼,請 重設服務主體認證。
選項 2:使用憑證建立 Azure 服務主體
az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>
將和 <resourceGroupId>
取代<servicePrincipalName>
為適當的值。
3.使用服務主體向 Azure 進行驗證
藉由使用 DefaultAzureCredential
,您可以避免撰寫環境特定的程式代碼向 Azure 進行驗證。
DefaultAzureCredential
使用 來定義環境變數來設定您的服務主體認證。
選擇下列其中一個選項來設定您的服務主體認證:
若要深入瞭解 DefaultAzureCredential
,請參閱 使用 Azure SDK for Go 進行 Azure 驗證
選項 1:使用秘密進行驗證
定義下列環境變數:
變數名稱 | 值 |
---|---|
AZURE_CLIENT_ID |
Azure 服務主體的應用程式標識碼 |
AZURE_TENANT_ID |
應用程式的 Microsoft Entra 租使用者識別碼 |
AZURE_CLIENT_SECRET |
Azure 服務主體的密碼 |
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"
選項 2:使用憑證進行驗證
變數名稱 | 值 |
---|---|
AZURE_CLIENT_ID |
Azure 服務主體的應用程式標識碼 |
AZURE_TENANT_ID |
應用程式的 Microsoft Entra 租使用者識別碼 |
AZURE_CLIENT_CERTIFICATE_PATH |
憑證檔案的路徑,包括私鑰(不含密碼保護) |
export AZURE_TENANT_ID="<active_directory_tenant_id"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"
使用 DefaultAzureCredential 來驗證 ResourceClient
NewDefaultAzureCredential
使用 Azure 身分識別模組的 函式來驗證 ResourceClient。
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
log.Fatalf("failed to obtain a credential: %v", err)
}
4.範例程序代碼
使用下列程式代碼範例來驗證您的服務主體是否向 Azure 進行驗證,並具有資源群組的適當許可權。
在主目錄中建立名為
go-on-azure
的新目錄。mkdir ~/go-on-azure
變更為
go-on-azure
目錄。cd ~/go-on-azure
執行
go mod init
以建立go.mod
檔案。go mod init go-on-azure
執行
go get
以安裝必要的 Go 模組。go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity" go get "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets"
建立名為
main.go
的檔案,並新增下列程序代碼。package main import ( "context" "fmt" "log" "os" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/keyvault/azsecrets" ) func createSecret(name, value string) { keyVaultName := os.Getenv("KEY_VAULT_NAME") keyVaultUrl := fmt.Sprintf("https://%s.vault.azure.net/", keyVaultName) cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { log.Fatalf("failed to obtain a credential: %v", err) } client, err := azsecrets.NewClient(keyVaultUrl, cred, nil) if err != nil { log.Fatalf("failed to create a client: %v", err) } resp, err := client.SetSecret(context.TODO(), name, value, nil) if err != nil { log.Fatalf("failed to create a secret: %v", err) } fmt.Printf("Name: %s, Value: %s\n", *resp.ID, *resp.Value) } func main() { createSecret("ExamplePassword", "hVFkk965BuUv") }
建立名為的
KEY_VAULT_NAME
環境變數。 將環境變數的值設定為先前建立的 Azure 金鑰保存庫 名稱。export KEY_VAULT_NAME=<KeyVaultName>
將取代
<KeyVaultName>
為您的 Azure 金鑰保存庫 實例名稱。go run
執行 命令以建立新的金鑰保存庫秘密。go run main.go
下一步
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應