Azure身份认证调用Graph API:DevOps管道中无需客户端密钥获取Data Factory服务主体的实现方案问询
解决方案:无需客户端密钥在DevOps管道中获取Data Factory服务主体
你现在的核心需求是在Azure DevOps管道里复用服务连接的已登录身份,避免手动传递或硬编码客户端密钥,下面是两种更优雅的实现方案:
方法1:使用Azure Identity库的DefaultAzureCredential(推荐)
Azure Identity是微软官方推荐的现代身份认证库,它能自动识别运行环境并选择合适的凭据来源——在DevOps管道中,当你通过AzureCLI@2任务完成登录后,它会自动复用这个会话的身份,完全不需要手动传入客户端ID或密钥。
步骤:
- 先安装所需依赖包:
pip install azure-identity requests
- 修改代码如下:
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
相关产品推荐
相关产品推荐

