关于 azure-identity-java
面向 Java 应用的 Azure 身份验证 SDK,通过 Microsoft Entra ID 获取访问令牌。提供多种凭据与可配置凭据链,适用于本地开发、云托管应用及自动化环境。
主要功能
- 01多种凭据类型
- 02默认凭据链
- 03托管身份与工作负载身份
- 04交互式浏览器及设备代码登录
- 05自定义凭据链
- 06主权云端点配置
适用场景
- 01为 Azure 服务客户端获取令牌
- 02在 Azure 托管应用中使用托管身份
- 03为 CI/CD 配置环境凭据
- 04为无头设备设置设备代码登录
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ sickn33/ agentic-awesome-skills --skill azure-identity-java安装后在 Claude Code 中输入/azure-identity-java确认已加载。
详细介绍
Azure Identity(Java)
使用 Microsoft Entra ID(Azure AD)对 Java 应用程序进行身份验证,以访问 Azure 服务。
安装
<dependency>
<groupId>com.azure</groupId>
<artifactId>azure-identity</artifactId>
<version>1.15.0</version>
</dependency>
核心概念
| 凭据 | 使用场景 |
|---|---|
DefaultAzureCredential | 推荐 - 适用于开发和生产环境 |
ManagedIdentityCredential | 托管在 Azure 上的应用(App Service、Functions、VM) |
EnvironmentCredential | 使用环境变量的 CI/CD 管道 |
ClientSecretCredential | 使用机密的服务主体 |
ClientCertificateCredential | 使用证书的服务主体 |
AzureCliCredential | 使用 az login 进行本地开发 |
InteractiveBrowserCredential | 交互式登录流程 |
DeviceCodeCredential | 无头设备身份验证 |
DefaultAzureCredential(推荐)
固定 SDK 版本,并在使用前核实确切的凭据链和功能。在生产环境中,优先显式使用预期的托管身份或工作负载身份,或限制凭据链,以免意外使用当前开发者凭据并静默选择其他主体。确认租户、资源终结点和最小权限角色;下方展示的机密值只是占位符,应从获批的存储中读取,绝不能作为字面值提交。默认情况下不要启用详细日志或账户日志。
DefaultAzureCredential 会按顺序尝试多种身份验证方式:
- 环境变量
- 工作负载身份
- 托管身份
- Azure CLI
- Azure PowerShell
- Azure Developer CLI
import com.azure.identity.DefaultAzureCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
// Simple usage
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
// Use with any Azure client
BlobServiceClient blobClient = new BlobServiceClientBuilder()
.endpoint("https://<storage-account>.blob.core.windows.net")
.credential(credential)
.buildClient();
KeyClient keyClient = new KeyClientBuilder()
.vaultUrl("https://<vault-name>.vault.azure.net")
.credential(credential)
.buildClient();
配置 DefaultAzureCredential
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.managedIdentityClientId("<user-assigned-identity-client-id>") // For user-assigned MI
.tenantId("<tenant-id>") // Limit to specific tenant
.excludeEnvironmentCredential() // Skip env vars
.excludeAzureCliCredential() // Skip Azure CLI
.build();
托管身份
适用于托管在 Azure 上的应用程序(App Service、Functions、AKS、VM)。
import com.azure.identity.ManagedIdentityCredential;
import com.azure.identity.ManagedIdentityCredentialBuilder;
// System-assigned managed identity
ManagedIdentityCredential credential = new ManagedIdentityCredentialBuilder()
.build();
// User-assigned managed identity (by client ID)
ManagedIdentityCredential credential = new ManagedIdentityCredentialBuilder()
.clientId("<user-assigned-client-id>")
.build();
// User-assigned managed identity (by resource ID)
ManagedIdentityCredential credential = new ManagedIdentityCredentialBuilder()
.resourceId("/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<name>")
.build();
使用机密的服务主体
import com.azure.identity.ClientSecretCredential;
import com.azure.identity.ClientSecretCredentialBuilder;
ClientSecretCredential credential = new ClientSecretCredentialBuilder()
.tenantId("<tenant-id>")
.clientId("<client-id>")
.clientSecret("<client-secret>")
.build();
使用证书的服务主体
import com.azure.identity.ClientCertificateCredential;
import com.azure.identity.ClientCertificateCredentialBuilder;
// From PEM file
ClientCertificateCredential credential = new ClientCertificateCredentialBuilder()
.tenantId("<tenant-id>")
.clientId("<client-id>")
.pemCertificate("<path-to-cert.pem>")
.build();
// From PFX file with password
ClientCertificateCredential credential = new ClientCertificateCredentialBuilder()
.tenantId("<tenant-id>")
.clientId("<client-id>")
.pfxCertificate("<path-to-cert.pfx>", "<pfx-password>")
.build();
// Send certificate chain for SNI
ClientCertificateCredential credential = new ClientCertificateCredentialBuilder()
.tenantId("<tenant-id>")
.clientId("<client-id>")
.pemCertificate("<path-to-cert.pem>")
.sendCertificateChain(true)
.build();
环境凭据
从环境变量中读取凭据。
import com.azure.identity.EnvironmentCredential;
import com.azure.identity.EnvironmentCredentialBuilder;
EnvironmentCredential credential = new EnvironmentCredentialBuilder().build();
必需的环境变量
使用机密的服务主体:
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>
使用证书的服务主体:
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_CERTIFICATE_PATH=/path/to/cert.pem
AZURE_CLIENT_CERTIFICATE_PASSWORD=<optional-password>
使用用户名/密码:
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_USERNAME=<username>
AZURE_PASSWORD=<password>
Azure CLI 凭据
适用于使用 az login 进行本地开发。
import com.azure.identity.AzureCliCredential;
import com.azure.identity.AzureCliCredentialBuilder;
AzureCliCredential credential = new AzureCliCredentialBuilder()
.tenantId("<tenant-id>") // Optional: specific tenant
.build();
交互式浏览器
适用于需要用户登录的桌面应用程序。
import com.azure.identity.InteractiveBrowserCredential;
import com.azure.identity.InteractiveBrowserCredentialBuilder;
InteractiveBrowserCredential credential = new InteractiveBrowserCredentialBuilder()
.clientId("<client-id>")
.redirectUrl("http://localhost:8080") // Must match app registration
.build();
设备代码
适用于无头设备(IoT、CLI 工具)。
import com.azure.identity.DeviceCodeCredential;
import com.azure.identity.DeviceCodeCredentialBuilder;
DeviceCodeCredential credential = new DeviceCodeCredentialBuilder()
.clientId("<client-id>")
.challengeConsumer(challenge -> {
// Display to user
System.out.println(challenge.getMessage());
})
.build();
链式凭据
创建自定义身份验证链。
import com.azure.identity.ChainedTokenCredential;
import com.azure.identity.ChainedTokenCredentialBuilder;
ChainedTokenCredential credential = new ChainedTokenCredentialBuilder()
.addFirst(new ManagedIdentityCredentialBuilder().build())
.addLast(new AzureCliCredentialBuilder().build())
.build();
工作负载身份(AKS)
适用于使用工作负载身份的 Azure Kubernetes Service。
import com.azure.identity.WorkloadIdentityCredential;
import com.azure.identity.WorkloadIdentityCredentialBuilder;
// Reads from AZURE_TENANT_ID, AZURE_CLIENT_ID, AZURE_FEDERATED_TOKEN_FILE
WorkloadIdentityCredential credential = new WorkloadIdentityCredentialBuilder().build();
// Or explicit configuration
WorkloadIdentityCredential credential = new WorkloadIdentityCredentialBuilder()
.tenantId("<tenant-id>")
.clientId("<client-id>")
.tokenFilePath("/var/run/secrets/azure/tokens/azure-identity-token")
.build();
令牌缓存
令牌缓存取决于凭据和版本。账户标识符日志用于诊断,并不表示已启用缓存;它可能会暴露账户元数据。只有通过受支持的特定凭据缓存 API 和获批的受保护存储配置持久缓存。
// Reuse a credential instance for supported in-memory token reuse
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.build();
// With shared token cache (for multi-credential scenarios)
SharedTokenCacheCredential credential = new SharedTokenCacheCredentialBuilder()
.clientId("<client-id>")
.build();
主权云
import com.azure.identity.AzureAuthorityHosts;
// Azure Government
DefaultAzureCredential govCredential = new DefaultAzureCredentialBuilder()
.authorityHost(AzureAuthorityHosts.AZURE_GOVERNMENT)
.build();
// Azure China
DefaultAzureCredential chinaCredential = new DefaultAzureCredentialBuilder()
.authorityHost(AzureAuthorityHosts.AZURE_CHINA)
.build();
错误处理
import com.azure.identity.CredentialUnavailableException;
import com.azure.core.exception.ClientAuthenticationException;
try {
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder().build();
AccessToken token = credential.getTokenSync(new TokenRequestContext()
.addScopes("https://management.azure.com/.default"));
} catch (CredentialUnavailableException e) {
// No credential could authenticate
System.out.println("Authentication failed: " + e.getMessage());
} catch (ClientAuthenticationException e) {
// Authentication error (wrong credentials, expired, etc.)
System.out.println("Auth error: " + e.getMessage());
}
日志记录
启用身份验证日志以进行调试。
// Via environment variable
// AZURE_LOG_LEVEL=verbose
// Or programmatically
DefaultAzureCredential credential = new DefaultAzureCredentialBuilder()
.enableAccountIdentifierLogging() // Log account info
.build();
环境变量
# DefaultAzureCredential configuration
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_CLIENT_SECRET=<client-secret>
# Managed Identity
AZURE_CLIENT_ID=<user-assigned-mi-client-id>
# Workload Identity (AKS)
AZURE_FEDERATED_TOKEN_FILE=/var/run/secrets/azure/tokens/azure-identity-token
# Logging
AZURE_LOG_LEVEL=verbose
# Authority host
AZURE_AUTHORITY_HOST=https://login.microsoftonline.com/
最佳实践
- 使用 DefaultAzureCredential - 从开发到生产环境都能无缝使用
- 在生产环境中使用托管身份 - 无需管理机密,并支持自动轮换
- 在本地开发时使用 Azure CLI - 运行应用前执行
az login - 最小权限 - 仅向服务主体授予所需权限
- 令牌缓存 - 默认启用,可减少身份验证往返
- 环境变量 - 用于 CI/CD,不要硬编码机密
凭据选择矩阵
| 环境 | 推荐的凭据 |
|---|---|
| 本地开发 | DefaultAzureCredential(使用 Azure CLI) |
| Azure App Service | DefaultAzureCredential(使用托管身份) |
| Azure Functions | DefaultAzureCredential(使用托管身份) |
| Azure Kubernetes Service | WorkloadIdentityCredential |
| Azure VM | DefaultAzureCredential(使用托管身份) |
| CI/CD 管道 | EnvironmentCredential |
| 桌面应用 | InteractiveBrowserCredential |
| CLI 工具 | DeviceCodeCredential |
触发短语
- “Azure authentication Java”、“DefaultAzureCredential Java”
- “managed identity Java”、“service principal Java”
- “Azure login Java”、“Azure credentials Java”
- “AZURE_CLIENT_ID”、“AZURE_TENANT_ID”
适用场景
此技能适用于执行概述中所述的工作流或操作。
限制
- 仅当任务明确符合上述范围时,才使用此技能。
- 不要将输出视为环境特定验证、测试或专家审查的替代品。
- 如果缺少必需的输入、权限、安全边界或成功标准,请暂停并要求澄清。
评论
支持 Markdown