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

2024-05-15

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

然而,为了获得最佳的用户体验,我真的想使用 Ajax 进行一些更新。我已经能够使用在我自己的帐户下创建的个人访问令牌 (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) {

    }
});

};

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

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

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

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

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

beforeSend: function (xhr) {
    xhr.setRequestHeader("Authorization", "Bearer " + btoa("" + ":" + accessToken));
},

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

我已经尝试过上述两种方法,但没有btoa函数,我相信它将令牌转换为 Base64,只是使用原始 accessToken 值传递。我还尝试过其他十几种方法,但总是得到相同的结果。

我的问题是如何使用 OAuth 承载令牌更新 Ajax 调用中的 VSTS 项目,就像使用 PAT 一样?


当同一登录地址同时用作 Microsoft 帐户和工作帐户时,其身份 ID 是不同的。并且同一工作帐号地址在不同域中的身份ID也不同。因此,如果您收到 OAuth 令牌的 401 错误,则可能是由于您用于颁发令牌的身份不正确导致的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐