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

如何向GitHub Action的Azure/login传递JSON格式凭据?

解决GitHub Actions中Azure/login的JSON凭据解析错误问题

问题背景

配置GitHub Actions工作流时,先通过存储在Secrets中的受限Service Principal登录Azure,再从KeyVault获取Project Contributor SP的凭据,构造JSON传递给Azure/login Action时出现JSON解析错误,报错包括Content is not a valid JSON object或格式无效的提示。

核心问题

错误根源有三点:

  1. JSON格式不规范:JSON要求键和值必须用双引号包裹,你用了单引号,导致Azure/login无法解析。
  2. 输出变量引用错误:工作流中引用输出时用了steps.query_key_vault_for_secret.output.PROJECTSPCREDSJSON,正确语法是outputs而非output。
  3. 手动拼接的转义风险:如果凭据包含特殊字符(如引号、反斜杠),手动拼接会破坏JSON结构。

修正方案

方案1:规范JSON格式并修正输出引用

修改Get Project Contributor SP Key Vault Secret步骤,确保JSON使用双引号,同时修正输出变量的引用:

- name: Get Project Contributor SP Key Vault Secret
  id: "query_key_vault_for_secret"
  run: |
      project_sp_client_id=$(az keyvault secret show --name "Project-SP-Client-ID" --vault-name "MyVault" --query value -o tsv)
      project_sp_secret_value=$(az keyvault secret show --name "Project-SP-SECRET-VALUE" --vault-name "MyVault" --query value -o tsv)
      subscription_id=$(az keyvault secret show --name "Subscription-ID" --vault-name "MyVault" --query value -o tsv)
      tenant_id=$(az keyvault secret show --name "Tenant-ID" --vault-name "MyVault" --query value -o tsv)
      
      # 用双引号构造标准JSON
      project_sp_creds_json=$(cat <<EOF
      {"client-id":"$project_sp_client_id",
       "client-secret":"$project_sp_secret_value",
       "subscription-id":"$subscription_id",
       "tenant-id":"$tenant_id"}
      EOF
      )

      echo "PROJECTSPCREDSJSON=$project_sp_creds_json" >> "$GITHUB_OUTPUT"

- name: Re-Login to Azure using Project SP
  uses: Azure/login@v1
  with:
      creds: ${{ steps.query_key_vault_for_secret.outputs.PROJECTSPCREDSJSON }}

方案2:用jq生成JSON(推荐,规避转义问题)

如果凭据包含特殊字符,手动拼接容易出错,用jq工具自动生成标准JSON更可靠:

- name: Get Project Contributor SP Key Vault Secret
  id: "query_key_vault_for_secret"
  run: |
      project_sp_client_id=$(az keyvault secret show --name "Project-SP-Client-ID" --vault-name "MyVault" --query value -o tsv)
      project_sp_secret_value=$(az keyvault secret show --name "Project-SP-SECRET-VALUE" --vault-name "MyVault" --query value -o tsv)
      subscription_id=$(az keyvault secret show --name "Subscription-ID" --vault-name "MyVault" --query value -o tsv)
      tenant_id=$(az keyvault secret show --name "Tenant-ID" --vault-name "MyVault" --query value -o tsv)
      
      # jq自动处理转义,生成标准JSON
      project_sp_creds_json=$(jq -n \
          --arg clientid "$project_sp_client_id" \
          --arg clientsecret "$project_sp_secret_value" \
          --arg subid "$subscription_id" \
          --arg tenantid "$tenant_id" \
          '{"client-id":$clientid, "client-secret":$clientsecret, "subscription-id":$subid, "tenant-id":$tenantid}')

      echo "PROJECTSPCREDSJSON=$project_sp_creds_json" >> "$GITHUB_OUTPUT"

- name: Re-Login to Azure using Project SP
  uses: Azure/login@v1
  with:
      creds: ${{ steps.query_key_vault_for_secret.outputs.PROJECTSPCREDSJSON }}

额外注意事项

  • ubuntu-latest runner默认包含Azure CLI,无需额外安装。
  • 确保初始Service Principal有读取KeyVault中对应密钥的权限。
  • 用jq生成的JSON会自动处理特殊字符转义,避免手动拼接的潜在问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:20:27