我目前有一个无代理发布管道,它可以对 https://dev.azure.com/myorg/ 上的 AzureDevops 管道进行 API 调用。目前,为了进行身份验证,我使用带有电子邮件地址和 PAT 令牌的通用服务连接
为了消除 PAT 令牌,我尝试使用服务主体 ID 和密钥。我尝试将
connection type
设置为 Azure resource manager
,选择适当的服务主体,但我无法使其正常工作。
Microsoft 目前支持这种身份验证方法吗?任何人都可以向我指出一些有关如何实现身份验证的信息吗?我不断收到的错误是
azure devops {"error":{"code":"MissingSubscription","message":"The request did not have a subscription or a valid tenant level resource provider."}} Exception Message:
使用 Invoke REST API 任务 调用 Azure DevOps REST API 时,建议使用“
system.AccessToken
”(作业访问令牌)作为授权,而不是使用用户 PAT 或服务主体访问令牌。
因为‘
system.AccessToken
’结合了安全性和便利性:
“
system.AccessToken
”由 Azure Pipelines 在运行时为每个作业动态生成。它在管道作业启动时生成,并在作业结束时撤销。
您可以通过控制以下身份的权限来控制‘
system.AccessToken
’的权限。
Project Collection Build Service ({Organization Name})
{Project Name} Build Service ({Organization Name})
有关更多详细信息,您可以查看“作业访问令牌”。
要使用 Invoke REST API 任务上的“
system.AccessToken
”来调用 Azure DevOps REST API,您可以执行以下操作:
假设我需要调用API“Runs - Get”来检查指定管道运行的状态是否成功完成。
转到“项目设置”>“服务连接”,创建一个通用服务连接,如下所示。您只需设置服务器URL和服务连接名称。
MyOrg
是 Azure DevOps 组织的名称,MyProj
是项目名称。
在 Invoke REST API 任务上,设置如下。
如果您想使用ServicePrincipal作为授权,您需要执行如下操作:
AAD 的先决条件。
Azure DevOps 的先决条件。
为服务主体生成访问令牌。您可以运行下面的 Bash 脚本来生成令牌。
access_token=$(curl -X POST -H "Content-Type: application/x-www-form-urlencoded" 'https://login.microsoftonline.com/{tenant_ID}/oauth2/v2.0/token' \
-d 'grant_type=client_credentials&client_id={client_id}&client_secret={client_secret}&scope=499b84ac-1321-427f-aa17-267ca6975798/.default' | jq -r '.access_token')
echo $access_token
{tenant_ID}
是 AAD 的目录(租户)ID。{client_id}
是服务主体的应用程序(客户端)ID。{client_secret}
是服务主体的客户端密钥的值。将
access_token
的值设置为管道中的秘密变量(即,将其命名为sp_access_token
)。然后在调用 REST API 任务中,使用 Headers
的密钥,如下所示。
{
"Authorization": "Bearer $(sp_access_token)"
}
服务主体的访问令牌只有 24 小时的生命周期,因为 AAD 将定期轮换令牌。因此,您需要至少每 24 小时刷新一次令牌。这可能会在管道作业中使用令牌时造成不便。
因此,如上所述,建议使用 '
system.AccessToken
'。
谢谢你。这没有任何问题。尽管此信息在这里得到了很好的解释,但我很难在 Microsoft 文档中找到它