在对 VSTS API 的 Ajax 调用中使用 OAuth Bearer Token 而不是 PAT
Use OAuth Bearer Token instead of PAT in Ajax calls to VSTS API
我已经成功地让我的 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: Resource not available for anonymous access. Client authentication required.
我尝试了很多 Ajax 调用的变体,但 none 有效。我试过添加
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + btoa("" + ":" + accessToken));
},
这似乎更接近我在网上找到的一些类似的例子,但不起作用。
我已经在没有 btoa
函数的情况下尝试了上述两种方法,我认为它正在将令牌转换为 Base64,只是使用原始 accessToken 值传递。而且我已经尝试了很多其他的东西,总是得到相同的结果。
我的问题是如何使用 OAuth Bearer Token 更新 Ajax 调用中的 VSTS 项目,就像我可以使用 PAT 一样?
参考这些代码:
$.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 中创建应用程序时检查相关范围(例如工作项)。
同一个登录地址同时作为微软账户和工作账户时,身份id不同。并且同一工作账号地址在不同域下身份的id也是不同的。因此,如果您使用 OAuth 令牌时遇到 401 错误,可能是因为您用于颁发令牌的身份不正确。
我已经成功地让我的 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: Resource not available for anonymous access. Client authentication required.
我尝试了很多 Ajax 调用的变体,但 none 有效。我试过添加
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + btoa("" + ":" + accessToken));
},
这似乎更接近我在网上找到的一些类似的例子,但不起作用。
我已经在没有 btoa
函数的情况下尝试了上述两种方法,我认为它正在将令牌转换为 Base64,只是使用原始 accessToken 值传递。而且我已经尝试了很多其他的东西,总是得到相同的结果。
我的问题是如何使用 OAuth Bearer Token 更新 Ajax 调用中的 VSTS 项目,就像我可以使用 PAT 一样?
参考这些代码:
$.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 中创建应用程序时检查相关范围(例如工作项)。
同一个登录地址同时作为微软账户和工作账户时,身份id不同。并且同一工作账号地址在不同域下身份的id也是不同的。因此,如果您使用 OAuth 令牌时遇到 401 错误,可能是因为您用于颁发令牌的身份不正确。