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

Azure身份认证调用Graph API:DevOps管道中无需客户端密钥获取Data Factory服务主体的实现方案问询

解决方案:无需客户端密钥在DevOps管道中获取Data Factory服务主体

你现在的核心需求是在Azure DevOps管道里复用服务连接的已登录身份,避免手动传递或硬编码客户端密钥,下面是两种更优雅的实现方案:

方法1:使用Azure Identity库的DefaultAzureCredential(推荐)

Azure Identity是微软官方推荐的现代身份认证库,它能自动识别运行环境并选择合适的凭据来源——在DevOps管道中,当你通过AzureCLI@2任务完成登录后,它会自动复用这个会话的身份,完全不需要手动传入客户端ID或密钥。

步骤:

  1. 先安装所需依赖包:
pip install azure-identity requests
  1. 修改代码如下:
from azure.identity import DefaultAzureCredential
import requests

# 自动适配DevOps环境中的CLI登录身份
credential = DefaultAzureCredential()

# 获取Graph API的访问令牌
token = credential.get_token("https://graph.microsoft.com/.default")

# 调用Graph API查询Data Factory对应的服务主体
datafactory_name = "你的DataFactory名称"
input_endpoint = f"https://graph.microsoft.com/v1.0/servicePrincipals?$filter=startswith(displayName,'{datafactory_name}')"
graph_data = requests.get(
    input_endpoint,
    headers={'Authorization': f'Bearer {token.token}'}
).json()

# 处理并使用返回结果
print(graph_data)

为什么这个方案可行?

DefaultAzureCredential会按优先级尝试多种凭据来源,在DevOps管道场景下,AzureCLI@2任务会在环境中留下CLI登录的会话信息,该库会自动识别并使用这个身份获取令牌,全程不需要你手动管理密钥。

方法2:直接从Azure CLI获取令牌传递给代码

如果你不想引入新的依赖库,可以直接在DevOps管道中通过Azure CLI命令获取Graph API的令牌,再作为环境变量传递给容器中的代码。

DevOps管道任务配置示例(YAML):

- task: AzureCLI@2
  inputs:
    azureSubscription: '你的服务连接名称'
    scriptType: 'bash'
    scriptLocation: 'inlineScript'
    inlineScript: |
      # 获取Graph API的访问令牌
      GRAPH_TOKEN=$(az account get-access-token --resource https://graph.microsoft.com --query accessToken -o tsv)
      # 将令牌设置为DevOps管道变量,供后续任务使用
      echo "##vso[task.setvariable variable=GRAPH_TOKEN]$GRAPH_TOKEN"

# 运行容器时传入令牌环境变量
- task: Docker@2
  inputs:
    containerRegistry: '你的容器注册表'
    command: 'run'
    arguments: '--env GRAPH_TOKEN=$(GRAPH_TOKEN) 你的镜像名称'

对应代码修改:

直接读取环境变量中的令牌调用Graph API,无需MSAL认证步骤:

import os
import requests

datafactory_name = "你的DataFactory名称"
input_endpoint = f"https://graph.microsoft.com/v1.0/servicePrincipals?$filter=startswith(displayName,'{datafactory_name}')"
graph_data = requests.get(
    input_endpoint,
    headers={'Authorization': f'Bearer {os.environ.get("GRAPH_TOKEN")}'}
).json()

print(graph_data)

你之前尝试失败的原因

你用azure.common.credentials.get_azure_cli_credentials()获取的凭据是Azure SDK专用的凭据对象,不能直接作为MSAL的client_credential参数——MSAL的client_credential要求传入客户端密钥字符串或证书,而非这种SDK实例,所以会触发invalid_client错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 06:04:06