使用 oAuth 访问 Azure DevOps REST API

bal*_*aji 4 azure-devops

我已在 AzureAD 中使用“Azure DevOps”权限创建了我的应用程序。

下面是我从 Azure DevOps 获取项目列表的代码

 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;
            }
Run Code Online (Sandbox Code Playgroud)

但我收到错误“您无权访问https://dev.azure.com ”。

我正在使用 oAuth 2.0 客户端凭据流程来获取访问令牌。可能是什么原因

bry*_*ook 7

通常,当您希望应用程序代表调用用户与 Azure DevOps API 进行通信而不必每次都提示输入用户名和密码时,您可以使用带有 oAuth 的 REST API。为此,用户需要授权应用程序代表他们与 Azure DevOps API 进行通信。

下一页提供了此过程的详细概述

用户授权您的应用程序

在较高级别上,您调用“授权”端点并提供回调。回调必须是应用程序中的安全 URL (https):

https://app.vssps.visualstudio.com/oauth2/authorize
    ?client_id={app ID}
    &response_type=Assertion
    &state={state}
    &scope={scope}
    &redirect_uri={callback URL}
Run Code Online (Sandbox Code Playgroud)

假设用户接受授权,Azure DevOps 将使用 URL 中的授权代码重定向到您的回调位置。

https://fabrikam.azurewebsites.net/myapp/oauth-callback
    ?code={authorization code}
    &state={state}
Run Code Online (Sandbox Code Playgroud)

获取访问令牌

现在您的应用程序已获得授权,您需要获取访问令牌:

POST https://app.vssps.visualstudio.com/oauth2/token
Run Code Online (Sandbox Code Playgroud)

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
    );
}
Run Code Online (Sandbox Code Playgroud)

响应将在 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 }
}
Run Code Online (Sandbox Code Playgroud)

请注意,令牌不是永久的,可能需要刷新。

使用授权标头

最后,现在您已经有了用户访问令牌,您可以将其包含在向服务器发出的请求的 Authorization 标头中。

GET https://dev.azure.com/myaccount/myproject/_apis/build-release/builds?api-version=3.0
Authorization: Bearer {access_token}
Run Code Online (Sandbox Code Playgroud)

例如:

httpClient.DefaultRequestHeaders.Authorization =
   new AuthenticationHeaderValue("Bearer", "{access_token}");
Run Code Online (Sandbox Code Playgroud)

如果您没有使用专用应用程序,而只想使用您控制的凭据查询 API,请使用个人访问令牌,因为它要容易得多:

httpClient.DefaultRequestHeaders.Authorization =
   new AuthenticationHeaderValue("Basic {base-64-encoded-string of username:PAT}");
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

13633 次

最近记录:

6 年,5 月 前