如何在DevOps流水线中通过服务主体授权API调用并认证Invoke-RestMethod请求
利用服务主体凭据对Invoke-RestMethod请求进行身份认证
核心思路
先通过服务主体的servicePrincipalId、servicePrincipalKey和tenantId获取Azure AD访问令牌,再将令牌作为Authorization请求头的一部分,传递给目标API调用。
具体实现步骤
1. 获取Azure AD访问令牌
使用PowerShell调用Azure AD令牌端点,获取针对目标API的访问令牌(以Azure DevOps API为例):
# 读取流水线中注入的服务主体参数 $servicePrincipalId = "$(servicePrincipalId)" $servicePrincipalKey = "$(servicePrincipalKey)" $tenantId = "$(tenantId)" # 目标API的受众标识,Azure DevOps固定为https://dev.azure.com/ $resource = "https://dev.azure.com/" # 构造令牌请求参数 $tokenRequestBody = @{ grant_type = "client_credentials" client_id = $servicePrincipalId client_secret = $servicePrincipalKey resource = $resource } # 发送请求获取访问令牌 $tokenResult = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenantId/oauth2/token" -Method Post -Body $tokenRequestBody $accessToken = $tokenResult.access_token
2. 携带令牌调用目标API
将获取到的令牌放入请求头,发起API调用(示例为查询项目基本信息):
# 替换为实际的组织和项目名称 $orgName = "你的组织名称" $projectName = "你的目标项目名称" # 构造API请求头 $apiHeaders = @{ "Authorization" = "Bearer $accessToken" "Content-Type" = "application/json" } # 调用Azure DevOps项目信息API $apiUrl = "https://dev.azure.com/$orgName/$projectName/_apis/projects?api-version=7.1-preview.4" $apiResponse = Invoke-RestMethod -Uri $apiUrl -Method Get -Headers $apiHeaders # 输出响应结果 $apiResponse | ConvertTo-Json -Depth 10
注意事项
- 需确保服务主体已被授予目标Azure DevOps项目的对应权限,可在组织设置中为服务主体分配项目级角色。
- 如果调用的是其他Azure服务API,只需修改
$resource的值为对应服务的受众URL(例如Azure管理API为https://management.azure.com/)。
内容的提问来源于stack exchange,提问作者end-user
相关产品推荐
相关产品推荐

