在对VSTS API的Ajax调用中使用OAuth Bearer Token而不是PAT

时间:2017-10-27 15:22:22

标签: ajax oauth-2.0 azure-devops azure-devops-rest-api

我已经成功地让我的ASP.NET(MVC5)应用程序在服务器端读取和写入C#中的VSTS工作项。

但是,为了获得最佳用户体验,我真的想使用Ajax进行一些更新。我已经能够使用在我自己的帐户下创建的个人访问令牌(PAT)完美地工作。例如,这很好用:

MainActivity

};

一旦有效,我认为转向使用OAuth而不是我的PAT会很容易。比如将上面列出的代码的第一行更改为:

var vstsAuthHeader = { "Authorization": "Basic " + btoa("" + ":" + "abcd...123") }

function updateRoadmapGroup(featureId, newRoadmapGroup) {
var patchDocument = [{
    "op": "replace",
    "path": "/fields/CustomScrum.RoadmapGroupID",
    "value": newRoadmapGroup
}];
var patchValue = JSON.stringify(patchDocument);

$.ajax({
    method: "PATCH",
    url: "https://myaccount.visualstudio.com/_apis/wit/workitems/" + featureId + "?api-version=" + apiVersion,
    contentType: "application/json-patch+json",
    beforeSend: function (xhr) {
      xhr.setRequestHeader(vstsAuthHeader);
    },
    processData: false,
    data: patchValue,
    error: function (exception) {
        console.log(exception);
    },
    success: function (data) {

    }
});

这不起作用 - 我收到错误“401(未经授权)”,当我深入研究完整错误时:

  

TF400813:资源不可用于匿名访问。需要客户端身份验证。

我已经尝试了很多Ajax调用的变体,但都没有用。我试过添加

var vstsAuthHeader = { "Authorization": "Bearer " + btoa("" + ":" + accessToken) }    

这似乎更接近我在网上找到的类似事情的一些例子,但是不起作用。

我在没有beforeSend: function (xhr) { xhr.setRequestHeader("Authorization", "Bearer " + btoa("" + ":" + accessToken)); }, 函数的情况下尝试了上述两种方法,我认为这是将令牌转换为Base64,只是使用原始accessToken值传递。而且我已经尝试了其他一些东西,总是有相同的结果。

我的问题是如何使用OAuth Bearer Token以与我能够使用PAT相同的方式更新Ajax调用中的VSTS项目?

2 个答案:

答案 0 :(得分:1)

请参阅以下代码:

 $.ajax({
                    type: 'GET',
                    url: 'https://XXX.visualstudio.com/DefaultCollection/_apis/wit/workitems/209?api-version=1.0',
                    cache: false,
                    dataType: 'json',
                    beforeSend: function (xhr) {
                        var b = "Bearer [auth token]";

                        xhr.setRequestHeader("Authorization", b);
                    },
                }).done(function (data) {

                }).error(function (e) {

                });

另一方面,在VSTS中创建应用程序时,请确保检查相关范围(例如工作项)。

答案 1 :(得分:1)

当用作Microsoft帐户和工作帐户时,同一登录地址的身份ID不同。并且对于不同域中的相同工作帐户地址,身份的ID也是不同的。因此,如果您使用OAuth令牌获得401错误,则可能是由于您用于发出令牌的身份不正确所致。