Appearance
Azure 托管标识认证让运行在 Azure 上的应用通过 Entra ID 获取访问 Copilot 的 token,无需在代码或配置文件中存储任何密钥。使用 DefaultAzureCredential 自动处理 token 获取,每小时刷新一次,适合企业级 Azure 部署场景。
GitHub Copilot SDK Azure 托管标识认证:企业 Azure 环境的免密钥方案
适用场景
- 应用部署在 Azure VM、AKS、Azure Container Apps、Azure Functions 上
- 企业通过 Microsoft Entra ID(原 Azure AD) 统一管理身份
- 需要零密钥方案,不在代码或环境变量中存放 GitHub token
前提条件
- Azure 订阅并启用了 GitHub Copilot Enterprise 的 Microsoft Entra ID 集成
- 目标 Azure 资源(VM/AKS Pod/Function)已启用系统托管标识(System-assigned Managed Identity)
- 托管标识已被授予访问 Copilot 的权限
安装依赖
bash
npm install @github/copilot-sdk @azure/identity基本用法
typescript
import { createSession } from '@github/copilot-sdk'
import { DefaultAzureCredential } from '@azure/identity'
async function main() {
const credential = new DefaultAzureCredential()
const session = await createSession({
auth: {
type: 'azure-managed-identity',
credential,
// Copilot 服务的 Entra ID 资源 ID
resource: 'api://GithubCopilot'
}
})
const response = await session.sendPrompt({
messages: [{ role: 'user', content: '帮我写一个 Azure Blob 上传文件的函数' }]
})
console.log(response.content)
}DefaultAzureCredential 的认证链
DefaultAzureCredential 会按顺序尝试以下认证方式:
- 环境变量(本地开发用)
- Workload Identity(AKS)
- 托管标识(VM、Container Apps)
- Azure CLI(本地开发,已登录
az login) - Azure PowerShell
- Azure Developer CLI
这意味着同一份代码在本地开发时用 az login 认证,部署到 Azure 后自动切换为托管标识,无需修改代码。
Token 自动刷新
Azure Managed Identity token 有效期为 1 小时,SDK 需要在 token 过期前刷新:
typescript
import { DefaultAzureCredential } from '@azure/identity'
const credential = new DefaultAzureCredential()
const session = await createSession({
auth: {
type: 'azure-managed-identity',
credential,
resource: 'api://GithubCopilot',
// SDK 在 token 剩余有效期 < 5 分钟时自动刷新
tokenRefreshMarginSeconds: 300
}
})AKS 部署配置
在 Kubernetes 中,需要为 Pod 绑定 Workload Identity:
yaml
# pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: copilot-app
labels:
azure.workload.identity/use: "true" # 启用 Workload Identity
spec:
serviceAccountName: copilot-service-account
containers:
- name: app
image: your-app:latest
env:
- name: AZURE_CLIENT_ID
value: "your-managed-identity-client-id"typescript
// 在 AKS 中,AZURE_CLIENT_ID 环境变量告诉 DefaultAzureCredential 用哪个托管标识
const credential = new DefaultAzureCredential()本地开发模拟
开发阶段用 Azure CLI 登录模拟托管标识认证:
bash
# 登录 Azure
az login
# 确认当前订阅
az account show
# 设置正确的订阅(如果有多个)
az account set --subscription "your-subscription-id"代码无需修改,DefaultAzureCredential 自动识别 az login 的凭证。
与 GitHub PAT 方案的对比
| GitHub PAT | Azure 托管标识 | |
|---|---|---|
| 密钥管理 | 需要存储和轮换 | 无需,Azure 自动管理 |
| 适用范围 | 任何环境 | 仅 Azure 托管环境 |
| 审计追踪 | GitHub 日志 | Azure 审计日志 + GitHub 日志 |
| 零信任合规 | 需要额外配置 | 原生支持 |
常见问题
Q: 在本地开发时用 DefaultAzureCredential 报 "No credential providers worked" 怎么办?
A: 按顺序检查:① az login 是否已执行且 token 未过期(az account get-access-token);② 确认目标租户和订阅正确;③ 如果有多个账号,用 az account set 切换到正确的订阅。
Q: 托管标识认证和 GitHub OAuth 认证可以混用吗?
A: 不能在同一个 Session 中混用,但可以在应用层根据运行环境选择认证方式——Azure 环境用托管标识,其他环境降级到 PAT 或 OAuth。
Q: 我们公司用 GitHub Enterprise Server,托管标识方案还适用吗?
A: 需要确认你们的 GitHub Enterprise Server 是否配置了与 Microsoft Entra ID 的 SAML/OIDC 集成。具体配置参考 GitHub Enterprise Server 的 Entra ID 集成文档。