Azure вызов API DevOps REST для учетной записи-конечная точка возвращает ошибку TF400813 - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь прочитать все учетные записи, с которыми связан мой пользователь. Документация утверждает, что это возможно сделать, позвонив по номеру:

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;
}
...