使用服务主体进行 Azure SDK for Go 身份验证
在本教程中,通过使用机密或证书的 Azure 服务主体,使用 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>
将 <servicePrincipalName>
和 <resourceGroupId>
替换为相应的值。
确保复制密码值 - 它不可检索。 如果忘记了密码,请重置服务主体凭据。
选项 2:使用证书创建 Azure 服务主体
az ad sp create-for-rbac --name <servicePrincipal> --create-cert --role Contributor --scope <resourceGroupId>
将 <servicePrincipalName>
和 <resourceGroupId>
替换为相应的值。
3. 使用服务主体向 Azure 进行身份验证
通过使用 DefaultAzureCredential
,可避免写入环境特定的代码,以便向 Azure 进行身份验证。
通过定义环境变量,使用 DefaultAzureCredential
配置服务主体凭据。
选择以下选项之一来配置你的服务主体凭据:
要了解有关 DefaultAzureCredential
的详细信息,请参阅使用 Azure SDK for Go 进行 Azure 身份验证
选项 1:使用机密进行身份验证
定义以下环境变量:
变量名称 | 值 |
---|---|
AZURE_CLIENT_ID |
Azure 服务主体的应用程序 ID |
AZURE_TENANT_ID |
应用程序的 Microsoft Entra 租户的 ID |
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 服务主体的应用程序 ID |
AZURE_TENANT_ID |
应用程序的 Microsoft Entra 租户的 ID |
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 进行身份验证
使用 Azure 标识模块的 NewDefaultAzureCredential
函数对 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 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈