使用适用于 Go 的 Azure 标识模块进行 Azure 身份验证
在本教程中, 用于 Go 的 Azure 标识模块中的 DefaultAzureCredential 类型用于向 Azure 进行身份验证。 Azure 标识模块提供了多种凭据类型,这些凭据类型侧重于使用 Microsoft Entra ID 的 OAuth。
DefaultAzureCredential
通过组合常用凭据类型来简化身份验证。 它链式凭据类型,用于使用用于在开发环境中进行身份验证的凭据类型对 Azure 部署的应用程序进行身份验证。
先决条件
- Azure 订阅:如果没有 Azure 订阅,请在开始之前创建一个免费帐户。
- 已安装 Go:版本 1.18 或更高版本
1. 安装适用于 Go 的 Azure 标识模块
运行以下命令下载 azidentity 模块:
go get -u github.com/Azure/azure-sdk-for-go/sdk/azidentity
2. 向 Azure 进行身份验证
用于 DefaultAzureCredential
使用以下技术之一向 Azure 进行身份验证:
要详细了解不同的凭据类型,请参阅凭据类型。
选项 1:定义环境变量
DefaultAzureCredential
使用 EnvironmentCredential
类型来配置使用环境变量的身份验证,该身份验证支持三种身份验证类型。 从以下身份验证类型中选择,并定义合适的环境变量。
具有机密的服务主体
变量名称 | 值 |
---|---|
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>"
具有证书的服务主体
变量名称 | 值 |
---|---|
AZURE_CLIENT_ID |
Microsoft Entra 应用程序的 ID |
AZURE_TENANT_ID |
应用程序的 Microsoft Entra 租户的 ID |
AZURE_CLIENT_CERTIFICATE_PATH |
PEM 或 PKCS12 证书文件的路径,包括私钥 |
AZURE_CLIENT_CERTIFICATE_PASSWORD |
(可选)证书文件的密码 |
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_CERTIFICATE_PATH="<azure_client_certificate_path>"
用户名和密码
变量名称 | 值 |
---|---|
AZURE_CLIENT_ID |
Microsoft Entra 应用程序的 ID |
AZURE_USERNAME |
用户名(通常为电子邮件地址) |
AZURE_PASSWORD |
该用户的密码 |
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_USERNAME="<azure_username>"
export AZURE_PASSWORD="<azure_user_password>"
按上述顺序尝试配置。 例如,如果客户端机密和证书的值都存在,则使用客户端机密。 有关使用服务主体进行身份验证的端到端教程,请参阅 使用服务主体进行身份验证的 Azure SDK for Go 身份验证。
选项 2:使用工作负荷标识
Microsoft Entra 工作负荷 ID 使 Kubernetes 群集中的 Pod 能够使用 Kubernetes 标识(服务帐户)。 颁发 Kubernetes 令牌, OIDC 联合 使 Kubernetes 应用程序能够使用 Microsoft Entra ID 安全地访问 Azure 资源。
如果不存在所需的环境变量 EnvironmentCredential
, DefaultAzureCredential
则尝试使用 WorkloadIdentityCredential 进行身份验证。 WorkloadIdentityCredential
尝试从工作负荷标识 Webhook 设置的环境变量中读取服务主体配置。
选项 3:使用托管标识
托管标识使开发人员无需管理凭据。 连接到支持 Microsoft Entra 身份验证的资源时,Azure 中托管的应用程序可以使用 Microsoft Entra 令牌而不是凭据。 本地开发不支持托管标识。
如果不存在所需的环境变量 WorkloadIdentityCredential
, DefaultAzureCredential
则尝试使用 ManagedIdentityCredential 进行身份验证。
如果使用用户分配的托管标识,请运行以下命令来设置 AZURE_CLIENT_ID
环境变量。
export AZURE_CLIENT_ID="<user_assigned_managed_identity_client_id>"
AZURE_CLIENT_ID
如果未设置环境变量,DefaultAzureCredentials
则尝试在托管资源上启用系统分配的托管标识进行身份验证。
有关在 Azure 托管应用中使用托管标识进行身份验证的端到端教程,请参阅 使用托管标识通过 Azure SDK for Go 进行身份验证。
选项 4:使用 Azure CLI 登录
若要减少本地开发中的摩擦, DefaultAzureCredential
可以在用户登录到 Azure CLI 时进行身份验证。
运行以下命令登录 Azure CLI:
az login
选项 5:使用 Azure 开发人员 CLI 登录
在本地开发中,如果用户未登录到 Azure CLI, DefaultAzureCredential
则可以在登录到 Azure 开发人员 CLI 时进行身份验证。
运行以下命令以登录到 Azure 开发人员 CLI:
azd auth login
不建议对在 Azure 中运行的应用程序使用 Azure 开发人员 CLI 身份验证。
3. 使用 DefaultAzureCredential 对 ResourceClient 进行身份验证
创建一 azure-auth
个名为测试 Azure 身份验证的新示例 Go 模块,其中包含 DefaultAzureCredential
:
创建一个目录来测试并运行示例 Go 代码,然后切换到该目录。
运行 go mod init 以创建模块:
go mod init azure-auth
运行 go 即可 下载、生成和安装必要的 Azure SDK for Go 模块:
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity" go get "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription"
创建名为
main.go
的文件并插入下列代码:package main import ( "context" "github.com/Azure/azure-sdk-for-go/sdk/azidentity" "github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/subscription/armsubscription" ) const subscriptionID = "<subscription ID>" func main() { cred, err := azidentity.NewDefaultAzureCredential(nil) if err != nil { // TODO: handle error } // Azure SDK Resource Management clients accept the credential as a parameter. // The client will authenticate with the credential as necessary. client, err := armsubscription.NewSubscriptionsClient(cred, nil) if err != nil { // TODO: handle error } _, err = client.Get(context.TODO(), subscriptionID, nil) if err != nil { // TODO: handle error } }
将
<subscription ID>
替换为订阅 ID。运行
go run
以生成并运行应用程序:go run .
注意
若要在本地系统上按原样运行,需要使用 Azure CLI 或 Azure 开发人员 CLI 登录到 Azure。
使用 DefaultAzureCredential 向 Azure 进行身份验证
在应用程序中使用以下代码通过 Azure 标识模块 DefaultAzureCredential
向 Azure 进行身份验证:
// This credential type checks environment variables for configuration.
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// handle error
}
// Azure Resource Management clients accept the credential as a parameter
client, err := armresources.NewClient("<subscriptionId>", cred, nil)
if err != nil {
// handle error
}
故障排除
有关解决特定凭据类型错误的指导,请参阅 故障排除指南。