Я пытаюсь прочитать все учетные записи, с которыми связан мой пользователь. Документация утверждает, что это возможно сделать, позвонив по номеру:
GET https://app.vssps.visualstudio.com/_apis/accounts?api-version=5.1
Поскольку документы немного сбивают с толку, возможно, мне придется позвонить
GET https://app.vssps.visualstudio.com/_apis/accounts?ownerId={GUID}&api-version=5.1
вместо.
Я использую OAuth-Authentication . Чтобы заставить его работать, я создал приложение ASP. NET Core. Я создал регистрацию приложения в DevOps и без проблем извлекаю токен OAuth со следующими областями:
- vso.auditlog
- vso.connected_server
- vso. информационные панели
- vso.entitlements
- vso.environment_manage
- vso.graph
- vso.identity
- vso.loadtest
- vso.machinegroup_manage
- vso.memberentitlementmanagement
- vso.profile
- vso.project
- vso.securefiles_read
- vso.security_manage
- vso.taskgroups_read
- vso.tokenadministration
- vso.tokens
- vso.variablegroups_read
- vso. wiki
Согласно документам для этого запроса необходимо только vso.profile
.
Однако полученный результат всегда:
HttpRequestException: Response status code does not indicate success: 401 (TF400813: The user '{AZURE_TENANT_ID}\{MY_MAIL_ADDRESS}' is not authorized to access this resource.).
Другие запросы работают нормально, например:
GET https://dev.azure.com/{organization}/{project}/_apis/build/builds?api-version=5.1
Запрос на учетную запись является специальным, потому что он может быть отправлен без установка контекста для определенной c организации или проекта. Я думаю, что это причина для разных результатов.
РЕДАКТИРОВАТЬ
После попытки сегодня использовать оба URL, упомянутых выше, я теперь получаю 400
в качестве кода состояния ответа , Это образец Bearer-Token, который я получил после того, как расшифровал его:
{
"nameid": "1340eb0b-cabf-476c-a950-a070c34ca367",
"scp": "vso.profile",
"aui": "a2d8bdf0-9406-415a-aa79-bee9e2600c37",
"appid": "e1bea2a2-****-****-****-************",
"iss": "app.vstoken.visualstudio.com",
"aud": "app.vstoken.visualstudio.com",
"nbf": 1587395030,
"exp": 1587398630
}
Вот некоторый упрощенный C# код, который я использую:
HttpClient client = _clientFactory.CreateClient("DevOps");
var token = await _authHelper.GetTokenAsync(tokenType);
client.DefaultRequestHeaders.Add("Authorization", $"Bearer { token.AccessToken}");
var uri = "https://app.vssps.visualstudio.com/_apis/accounts?api-version = 5.1";
try
{
var response = await client.GetAsync(uri);
response.EnsureSuccessStatusCode();
var content = await response.Content.ReadAsStringAsync();
return content;
}
catch (Exception ex)
{
// ex.Message = Response status code does not indicate success: 400 (Bad Request).
// ...
throw;
}