mcpField
A
azure-identity-java

azure-identity-java

github.com/sickn33安全48.7k61 次安装今天更新
代码仓库

关于 azure-identity-java

面向 Java 应用的 Azure 身份验证 SDK,通过 Microsoft Entra ID 获取访问令牌。提供多种凭据与可配置凭据链,适用于本地开发、云托管应用及自动化环境。

主要功能

  1. 01多种凭据类型
  2. 02默认凭据链
  3. 03托管身份与工作负载身份
  4. 04交互式浏览器及设备代码登录
  5. 05自定义凭据链
  6. 06主权云端点配置

适用场景

  1. 01为 Azure 服务客户端获取令牌
  2. 02在 Azure 托管应用中使用托管身份
  3. 03为 CI/CD 配置环境凭据
  4. 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 会按顺序尝试多种身份验证方式:

  1. 环境变量
  2. 工作负载身份
  3. 托管身份
  4. Azure CLI
  5. Azure PowerShell
  6. 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/

最佳实践

  1. 使用 DefaultAzureCredential - 从开发到生产环境都能无缝使用
  2. 在生产环境中使用托管身份 - 无需管理机密,并支持自动轮换
  3. 在本地开发时使用 Azure CLI - 运行应用前执行 az login
  4. 最小权限 - 仅向服务主体授予所需权限
  5. 令牌缓存 - 默认启用,可减少身份验证往返
  6. 环境变量 - 用于 CI/CD,不要硬编码机密

凭据选择矩阵

环境推荐的凭据
本地开发DefaultAzureCredential(使用 Azure CLI)
Azure App ServiceDefaultAzureCredential(使用托管身份)
Azure FunctionsDefaultAzureCredential(使用托管身份)
Azure Kubernetes ServiceWorkloadIdentityCredential
Azure VMDefaultAzureCredential(使用托管身份)
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