使用 Azure AD 应用程序创建 ADO PAT

Create ADO PAT with Azure AAD application

这是我一直在尝试做的事情:

  1. 在 AAD 下创建了一个应用程序。添加了 user_impersonation API 权限。创建了一个秘密并记下了 App ID
  2. 一直在尝试使用此 python 代码生成新的 PAT:
import msal
import requests

config = {
"authority": "https://login.microsoftonline.com/tenant-id",
"client_id": "client-app-id",
"scope": [ "client-app-id/.default"], # also tried with "499b84ac-1321-427f-aa17-267ca6975798/.default"
"secret": "client-secret",
"endpoint": "https://vssps.dev.azure.com/my-org/_apis/tokens/pats?api-version=7.1-preview.1"
}

app = msal.ConfidentialClientApplication(
        config["client_id"], authority=config["authority"],
        client_credential=config["secret"])

result = app.acquire_token_for_client(scopes=config["scope"])
print(result['access_token'])

pats=requests.post(config["endpoint"],
            headers={'Authorization': 'Bearer ' + result['access_token']},
            data={"displayName":"new_token1","scope":"vso.packaging_write",
            "validTo":"2022-12-01T23:46:23.319Z","allOrgs":"false"})
print(pats.json()) 
  1. 我也试过这个bash脚本:
az login --service-principal -u client-id \
-p client-secret --tenant tenant-id
token=`az account get-access-token |  jq -r '.accessToken'`
curl -X POST -H "Authorization: Bearer $token " -H "Content-Type:application/json" -H "Accept:application/json"  \
-d '{"displayName":"new_token1","scope":"vso.packaging_write","validTo":"2022-12-01T23:46:23.319Z","allOrgs":"false"}' \
'https://vssps.dev.azure.com/my-org/_apis/tokens/pats?api-version=7.1-preview.1'

这不起作用,获取响应网页。请帮忙。我可能缺少权限或服务主体的某些内容?

我们提供了一个服务器,可以在运行时从我们的 docker 图像中生成 user-pods。在 pods 中,我们提供了一个 UI 来访问 bash 终端。由于我们的用户可能不是技术人员,我们希望他们拥有 pip.conf/.npmrc 文件,其中 PAT 嵌入到 docker 图像中。有没有办法在构建管道中创建 PAT,它不依赖于任何实际用户(用户可以被删除等),然后将它们嵌入到 docker 图像中?

我检查了你的描述和代码。

是的,您的权限设置是正确的。但是从您的代码看来您正在尝试使用 'client credentials flow' 进行身份验证,这绝对是不可能的。

Azure DevOps API 不支持 non-interactive 通过服务主体访问服务。

看看这个(文档说得很清楚):

https://docs.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/authentication-guidance?view=azure-devops

本文档列出了您使用的包中可用的所有方法:

https://docs.microsoft.com/en-us/python/api/msal/msal.application.clientapplication?view=azure-python

我觉得应该是这个方法(反正你要用'authorization code flow'):

https://docs.microsoft.com/en-us/python/api/msal/msal.application.clientapplication?view=azure-python#msal-application-clientapplication-acquire-token-by-authorization-code

判断成功与否的方法很简单,因为你是用AAD app创建PAT的,所以关键看代码运行会不会跳出登录弹窗或者某些东西(必须是交互式的,non-interactive 不受支持。)。