Skip to content

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

前提条件

  1. Azure 订阅并启用了 GitHub Copilot Enterprise 的 Microsoft Entra ID 集成
  2. 目标 Azure 资源(VM/AKS Pod/Function)已启用系统托管标识(System-assigned Managed Identity)
  3. 托管标识已被授予访问 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 会按顺序尝试以下认证方式:

  1. 环境变量(本地开发用)
  2. Workload Identity(AKS)
  3. 托管标识(VM、Container Apps)
  4. Azure CLI(本地开发,已登录 az login
  5. Azure PowerShell
  6. 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 PATAzure 托管标识
密钥管理需要存储和轮换无需,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 集成文档。