如何向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或格式无效的提示。
核心问题
错误根源有三点:
- JSON格式不规范:JSON要求键和值必须用双引号包裹,你用了单引号,导致Azure/login无法解析。
- 输出变量引用错误:工作流中引用输出时用了
steps.query_key_vault_for_secret.output.PROJECTSPCREDSJSON,正确语法是outputs而非output。 - 手动拼接的转义风险:如果凭据包含特殊字符(如引号、反斜杠),手动拼接会破坏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
相关产品推荐
相关产品推荐

