Azure 身份验证 TypeScript 库
Azure Identity SDK for TypeScript
使用多种凭据类型对 Azure 服务进行身份验证。
安装
npm install @azure/identity环境变量
服务主体 (密钥)
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>工作负载身份 (Kubernetes)
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_ID=<client-id>
AZURE_FEDERATED_TOKEN_FILE=/var/run/secrets/tokens/azure-identityDefaultAzureCredential (推荐)
import { DefaultAzureCredential } from "@azure/identity";
const credential = new DefaultAzureCredential();
// 与任何 Azure SDK 客户端配合使用
import { BlobServiceClient } from "@azure/storage-blob";
const blobClient = new BlobServiceClient(
"https://<account>.blob.core.windows.net",
credential
);
凭据链顺序:
1. EnvironmentCredential
2. WorkloadIdentityCredential
3. ManagedIdentityCredential
4. VisualStudioCodeCredential
5. AzureCliCredential
6. AzurePowerShellCredential
7. AzureDeveloperCliCredential
托管身份 (Managed Identity)
系统分配
import { ManagedIdentityCredential } from "@azure/identity";
const credential = new ManagedIdentityCredential();
用户分配 (通过客户端 ID)
const credential = new ManagedIdentityCredential({
clientId: "<user-assigned-client-id>"
});用户分配 (通过资源 ID)
const credential = new ManagedIdentityCredential({
resourceId: "/subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<name>"
});服务主体 (Service Principal)
客户端密钥
import { ClientSecretCredential } from "@azure/identity";
const credential = new ClientSecretCredential(
"<tenant-id>",
"<client-id>",
"<client-secret>"
);
客户端证书
import { ClientCertificateCredential } from "@azure/identity";
const credential = new ClientCertificateCredential(
"<tenant-id>",
"<client-id>",
{ certificatePath: "/path/to/cert.pem" }
);
// 带密码
const credentialWithPwd = new ClientCertificateCredential(
"<tenant-id>",
"<client-id>",
{
certificatePath: "/path/to/cert.pem",
certificatePassword: "<password>"
}
);
交互式身份验证
基于浏览器的登录
import { InteractiveBrowserCredential } from "@azure/identity";
const credential = new InteractiveBrowserCredential({
clientId: "<client-id>",
tenantId: "<tenant-id>",
loginHint: "[email protected]"
});
设备代码流
import { DeviceCodeCredential } from "@azure/identity";
const credential = new DeviceCodeCredential({
clientId: "<client-id>",
tenantId: "<tenant-id>",
userPromptCallback: (info) => {
console.log(info.message);
// "To sign in, use a web browser to open..."
}
});
自定义凭据链
import {
ChainedTokenCredential,
ManagedIdentityCredential,
AzureCliCredential
} from "@azure/identity";
// 优先尝试托管身份,失败后回退到 CLI
const credential
= new ChainedTokenCredential(
new ManagedIdentityCredential(),
new AzureCliCredential()
);
## 开发者凭据
Azure CLI
const credential = new AzureCliCredential();
// 使用:az login
### Azure Developer CLIimport { AzureDeveloperCliCredential } from "@azure/identity";
const credential = new AzureDeveloperCliCredential();
// 使用:azd auth login
### Azure PowerShellimport { AzurePowerShellCredential } from "@azure/identity";
const credential = new AzurePowerShellCredential();
// 使用:Connect-AzAccount
## 主权云 (Sovereign Clouds)import { ClientSecretCredential, AzureAuthorityHosts } from "@azure/identity";
// Azure 政府云
const credential = new ClientSecretCredential(
"<tenant>", "<client>", "<secret>",
{ authorityHost: AzureAuthorityHosts.AzureGovernment }
);
// Azure 中国云
const credentialChina = new ClientSecretCredential(
"<tenant>", "<client>", "<secret>",
{ authorityHost: AzureAuthorityHosts.AzureChina }
);
## Bearer 令牌提供程序import { DefaultAzureCredential, getBearerTokenProvider } from "@azure/identity";
const credential = new DefaultAzureCredential();
// 创建一个返回令牌的函数
const getAccessToken = getBearerTokenProvider(
credential,
"https://cognitiveservices.azure.com/.default"
);
// 用于需要 bearer 令牌的 API
const token = await getAccessToken();
## 关键类型import type {
TokenCredential,
AccessToken,
GetTokenOptions
} from "@azure/core-auth";
import {
DefaultAzureCredential,
DefaultAzureCredentialOptions,
ManagedIdentityCredential,
ClientSecretCredential,
ClientCertificateCredential,
InteractiveBrowserCredential,
ChainedTokenCredential,
AzureCliCredential,
AzurePowerShellCredential,
AzureDeveloperCliCredential,
DeviceCodeCredential,
AzureAuthorityHosts
} from "@azure/identity";
## 自定义凭据实现import type { TokenCredential, AccessToken, GetTokenOptions } from "@azure/core-auth";
class CustomCredential implements TokenCredential {
async getToken(
scopes: string | string[],
options?: GetTokenOptions
): Promise<AccessToken | null> {
// 自定义令牌获取逻辑
return {
token: "<access-token>",
expiresOnTimestamp: Date.now() + 3600000
};
}
}
## 调试import { setLogLevel, AzureLogger } from "@azure/logger";
setLogLevel("verbose");
// 自定义日志处理器
AzureLogger.log = (...args) => {
console.log("[Azure]", ...args);
};
```
最佳实践
1. 使用 DefaultAzureCredential - 同时适用于开发环境 (CLI) 和生产环境 (托管标识)
2. 切勿硬编码凭据 - 使用环境变量或托管标识
3. 优先使用托管标识 - 生产环境中无需管理密钥
4. 合理配置凭据范围 - 在多租户场景中使用用户分配的标识
5. 处理令牌刷新 - Azure SDK 会自动处理
6. 使用 ChainedTokenCredential - 用于自定义回退场景
适用场景
本技能适用于执行概览中描述的工作流或操作。局限性
- 仅在任务与上述描述的范围明确匹配时使用此技能。
- 不要将输出视为针对特定环境的验证、测试或专家评审的替代方案。
- 如果需求不明确,请停止并请求澄清。