使用 Azure AD 应用程序创建 ADO PAT
Create ADO PAT with Azure AAD application
这是我一直在尝试做的事情:
- 在 AAD 下创建了一个应用程序。添加了 user_impersonation API 权限。创建了一个秘密并记下了 App ID
- 一直在尝试使用此 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())
- 我也试过这个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 通过服务主体访问服务。
看看这个(文档说得很清楚):
本文档列出了您使用的包中可用的所有方法:
我觉得应该是这个方法(反正你要用'authorization code flow'):
判断成功与否的方法很简单,因为你是用AAD app创建PAT的,所以关键看代码运行会不会跳出登录弹窗或者某些东西(必须是交互式的,non-interactive 不受支持。)。
这是我一直在尝试做的事情:
- 在 AAD 下创建了一个应用程序。添加了 user_impersonation API 权限。创建了一个秘密并记下了 App ID
- 一直在尝试使用此 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())
- 我也试过这个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 通过服务主体访问服务。
看看这个(文档说得很清楚):
本文档列出了您使用的包中可用的所有方法:
我觉得应该是这个方法(反正你要用'authorization code flow'):
判断成功与否的方法很简单,因为你是用AAD app创建PAT的,所以关键看代码运行会不会跳出登录弹窗或者某些东西(必须是交互式的,non-interactive 不受支持。)。