You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions已完成Azure认证,但代码无法获取Default Credentials

问题分析与解决方案

1. 检查环境变量传递

GitHub Actions的步骤默认是隔离的,Azure CLI登录生成的凭据上下文不会自动传递到构建环节。需要在构建步骤中显式传递必要的环境变量:

- name: Azure Login
  id: login
  uses: azure/login@v1
  with:
    client-id: ${{ secrets.AZURE_CLIENT_ID }}
    tenant-id: ${{ secrets.AZURE_TENANT_ID }}
    subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}

- name: Build Next.js app
  run: npm run build
  env:
    AZURE_CLIENT_ID: ${{ secrets.AZURE_CLIENT_ID }}
    AZURE_TENANT_ID: ${{ secrets.AZURE_TENANT_ID }}
    AZURE_ACCESS_TOKEN: ${{ steps.login.outputs.accessToken }}

2. 调整DefaultAzureCredential的优先级

DefaultAzureCredential会按链式顺序尝试凭据来源,在GitHub Actions环境中,可显式指定优先使用环境变量或Azure CLI凭据,避免不必要的来源尝试:

import { DefaultAzureCredential } from "@azure/identity";

const credential = new DefaultAzureCredential({
  excludeInteractiveBrowserCredential: true,
  excludeManagedIdentityCredential: true,
});

3. 验证构建环境的凭据可用性

在构建前添加调试步骤,确认环境变量是否正确加载:

- name: Debug Credential Env Vars
  run: |
    echo "AZURE_CLIENT_ID: $AZURE_CLIENT_ID"
    echo "AZURE_TENANT_ID: $AZURE_TENANT_ID"
    echo "AZURE_ACCESS_TOKEN exists: $([ -n "$AZURE_ACCESS_TOKEN" ] && echo "Yes" || echo "No")"

同时在Next.js代码中添加错误日志,定位具体失败环节:

try {
  const credential = new DefaultAzureCredential();
  const token = await credential.getToken("https://management.azure.com/.default");
  console.log("Token acquired successfully");
} catch (err) {
  console.error("Credential fetch failed:", JSON.stringify(err));
}

4. 确认联合凭据配置细节

  • 检查Azure AD应用的联合凭据:受众必须为api://AzureADTokenExchange,实体值需精确匹配GitHub仓库路径(如your-username/your-repo)
  • 确认目标资源(如存储账户、数据库)已为该应用分配了足够的角色权限(如Storage Blob Data Contributor)

内容的提问来源于stack exchange,提问作者Fizzy Vermin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 03:03:16