如何通过Entra应用注册使用OAuth2调用Azure DevOps API?
解决方案:用Entra应用注册认证调用Azure DevOps REST API
一、选对认证方式:服务主体(客户端凭证流程)
你要以应用身份自动化操作,后续迁到Azure Function,完全不用纠结需要回调URL的用户授权OAuth2流程。直接用服务主体认证(客户端凭证流程),无用户交互,适配脚本和服务端自动化场景。
二、Entra应用注册配置
- 在Entra ID里创建单租户应用注册(匹配你关联Azure DevOps的租户)
- 生成客户端密码(或用证书,证书更安全),务必保存好密码值(仅显示一次)
- 在Azure DevOps组织中,将该应用注册的名称添加为用户,分配对应权限:比如创建项目需
Project Collection Administrator权限,添加用户需对应用户管理权限
三、PowerShell中用服务主体调用API
1. 获取Azure DevOps访问令牌
$tenantId = "你的租户ID" $clientId = "应用注册的客户端ID" $clientSecret = "生成的客户端密码" # Azure DevOps固定资源ID $resource = "499b84ac-1321-427f-aa17-267ca6975798" $tokenUri = "https://login.microsoftonline.com/$tenantId/oauth2/token" $body = @{ grant_type = "client_credentials" client_id = $clientId client_secret = $clientSecret resource = $resource } $tokenResponse = Invoke-RestMethod -Uri $tokenUri -Method Post -Body $body -ContentType "application/x-www-form-urlencoded" $accessToken = $tokenResponse.access_token
2. 调用API执行操作(示例:创建新项目)
$orgName = "你的Azure DevOps组织名" $apiUrl = "https://dev.azure.com/$orgName/_apis/projects?api-version=7.1-preview.4" # 构造项目请求体,可按需修改模板类型、版本控制类型 $projectBody = @{ name = "自动化测试项目" description = "PowerShell自动创建的项目" capabilities = @{ versioncontrol = @{ sourceControlType = "Git" } processTemplate = @{ # Scrum模板ID,如需其他模板可替换对应ID templateTypeId = "6b724908-ef14-45cf-84f8-768b5384da45" } } } | ConvertTo-Json -Depth 10 Invoke-RestMethod -Uri $apiUrl -Method Post -Headers @{Authorization = "Bearer $accessToken"} -Body $projectBody -ContentType "application/json"
四、关于回调URL的澄清
你之前看的OAuth2流程是用户授权码流程,需要用户手动登录授权,因此才需要回调URL接收授权码。但你的场景用服务主体认证,完全不需要这套机制,不用关注回调、重定向URI这类内容。
五、Azure DevOps组织OAuth2配置的说明
你看到的Azure DevOps组织内的OAuth2配置,是给用户用第三方账号(比如Github、Bitbucket)登录Azure DevOps用的,和你用Entra应用注册认证完全无关,直接忽略即可。
六、迁移到Azure Function的注意事项
- 优先用托管身份代替客户端密码,安全性更高:给Azure Function分配系统托管身份或用户托管身份,然后在Azure DevOps组织中将该托管身份添加为用户并分配权限
- 用托管身份获取令牌的PowerShell代码示例:
# 获取Azure DevOps的访问令牌 $accessToken = (Invoke-RestMethod -Uri "http://localhost:50342/MSI/token?resource=499b84ac-1321-427f-aa17-267ca6975798&api-version=2019-08-01" -Headers @{Metadata="true"}).access_token
内容的提问来源于stack exchange,提问作者Marco
相关产品推荐
相关产品推荐

