RUDE

Создайте ADO PAT с помощью приложения Azure AAD.

Вот что я пытался сделать:

  1. Создал приложение под AAD. Добавлено разрешение API user_impersonation. Создал секрет и записал идентификатор приложения
  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'

Это не работает, получите веб-страницу в ответ. Пожалуйста помоги. Могу ли я пропустить разрешения или что-то в субъекте-службе?

Мы предоставляем сервер, который порождает пользовательские модули во время выполнения из наших образов докеров. И внутри модулей мы обслуживаем пользовательский интерфейс, который дает доступ к терминалу bash. Поскольку наши пользователи могут быть не техническими специалистами, мы хотели бы, чтобы у них были файлы pip.conf/.npmrc с PAT, встроенными в образ докера. Есть ли способ создать PAT в конвейерах сборки, которые не зависят от какого-либо реального пользователя (пользователи могут быть удалены и т. д.), а затем встроить их в образ докера?


75
1

Ответ:

Решено

Я проверил ваше описание и код.

Да, ваши настройки разрешений верны. Но из вашего кода похоже, что вы пытаетесь использовать «поток учетных данных клиента» для аутентификации, что определенно невозможно.

Azure DevOps API не поддерживает неинтерактивный доступ к службе через субъекты-службы.

Взгляните на это (документация делает это очень ясным):

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

enter image description here

В этом документе перечислены все методы, доступные в используемом вами пакете:

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

Я думаю, что это должен быть этот метод (в любом случае вам нужно использовать «поток кода авторизации»):

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

Способ определить, успешен он или нет, очень прост, потому что вы используете приложение AAD для создания PAT, поэтому ключ в том, чтобы увидеть, выскочит ли работающий код из всплывающего окна входа в систему или что-то еще (должен быть интерактивным, неинтерактивным не поддерживается.).