Доступ к REST API Azure DevOps с помощью oAuth - PullRequest
0 голосов
/ 10 июня 2019

Я создал свое приложение в AzureAD с разрешением «DevOps Azure».

Ниже приведен мой код для получения списка проектов из DevOps Azure

 using (HttpClient client = new HttpClient())
            {

                HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, "https://login.microsoftonline.com/21d63aec-6502-4638-98f3-04587e69d53b/oauth2/v2.0/token");
                requestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                Dictionary<String, String> form = new Dictionary<String, String>()
            {
                { "grant_type", "client_credentials" },
                { "client_id", "ac313ad2...." },
                { "scope", "https://app.vssps.visualstudio.com/.default" },
                { "client_secret", "BX0RldhqL...." }
            };
                requestMessage.Content = new FormUrlEncodedContent(form);

                HttpResponseMessage responseMessage = client.SendAsync(requestMessage).Result;

                if (responseMessage.IsSuccessStatusCode)
                {
                    String body = responseMessage.Content.ReadAsStringAsync().Result;

                    JsonConvert.PopulateObject(body, tokenModel);

                }
            }


using (ProjectHttpClient projectHttpClient = new ProjectHttpClient(new Uri("https://dev.azure.com/AlfabetChennaiDev"), new VssOAuthAccessTokenCredential(tokenModel.AccessToken)))
            {
                IEnumerable<TeamProjectReference> projects = projectHttpClient.GetProjects().Result;
            }

Но я получаю ошибкукак "У вас нет прав доступа https://dev.azure.com."

Я использую поток учетных данных клиента oAuth 2.0 для получения токена доступа. В чем может быть причина

1 Ответ

1 голос
/ 10 июня 2019

Обычно вы используете API REST, используя oAuth, когда хотите, чтобы ваше приложение связывалось с API Azure DevOps от имени вызывающего пользователя без необходимости каждый раз запрашивать имена пользователей и пароли. Для этого пользователь должен будет авторизовать приложение для связи с API Azure DevOps от его имени.

Следующая страница предоставляет хороший обзор этого процесса .

Пользователь авторизует ваше приложение

На высоком уровне вы вызываете конечную точку авторизации и предоставляете обратный вызов. Обратный вызов должен быть защищенным URL-адресом (https) в вашем приложении:

https://app.vssps.visualstudio.com/oauth2/authorize
    ?client_id={app ID}
    &response_type=Assertion
    &state={state}
    &scope={scope}
    &redirect_uri={callback URL}

Предполагая, что пользователь принимает авторизацию, Azure DevOps перенаправляет в ваше местоположение обратного вызова с кодом авторизации в URL.

https://fabrikam.azurewebsites.net/myapp/oauth-callback
    ?code={authorization code}
    &state={state}

Получить токен доступа

Теперь, когда ваше приложение авторизовано, вам нужно получить токен доступа:

POST https://app.vssps.visualstudio.com/oauth2/token

Форма application/x-www-form-urlencoded имеет следующий текст с секретом приложения при создании приложения, кодом авторизации, который вы только что получили, когда пользователь авторизовал ваше приложение, и защищенным обратным вызовом.

public string GenerateRequestPostData(string appSecret, string authCode, string callbackUrl)
{
   return String.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}",
           HttpUtility.UrlEncode(appSecret),
           HttpUtility.UrlEncode(authCode),
           callbackUrl
    );
}

Ответ будет содержать токен доступа в ответе JSON.

{
   "access_token": { access token for the user },
   "token_type": { type of token },
   "expires_in": { time in seconds that the token remains valid },
   "refresh_token": { refresh token to use to acquire a new access token }
}

Обратите внимание, что токен не является постоянным и может нуждаться в обновлении.

Использовать заголовок авторизации

Наконец, теперь, когда у вас есть токен доступа пользователя, вы можете включить его в заголовок авторизации в своих запросах к серверу.

GET https://dev.azure.com/myaccount/myproject/_apis/build-release/builds?api-version=3.0
Authorization: Bearer {access_token}

Например:

httpClient.DefaultRequestHeaders.Authorization =
   new AuthenticationHeaderValue("Bearer", "{access_token}");

Если вы не используете выделенное приложение и просто хотите запросить API с учетными данными, которые вы контролируете, - используйте токен личного доступа, так как это намного проще:

httpClient.DefaultRequestHeaders.Authorization =
   new AuthenticationHeaderValue("Basic {base-64-encoded-string of username:PAT}");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...