在撰写本文时,OAuth 机制用于 VSO api,正如您似乎已经确定的那样。 official docs for VSO OAuth tokens here。
但是,对于本地部署,需要以下内容:
通过 javascript 客户端(注意我在这里使用 jquery 来处理 ajax 请求)
由于在本地无法使用替代凭据或基于令牌的身份验证来匹配当前的 vso 实施;您可以考虑以下方法:如果您对 TFS 应用层具有管理员权限,则可以在 IIS 中为 tfs 应用程序配置基本身份验证,并设置默认域。
然后调用如下:
var self = this;
self.tasksURI = 'https://<SERVER>/tfs/<COLLECTION>/<PROJECT>/_apis/build/builds?api-version=2.0';
self.username = "<USERNAME>"; //basic username so no domain here.
self.password = "<PASSWORD>";
self.ajax = function (uri, method, data) {
var request = {
url: uri,
type: method,
contentType: "application/json",
accepts: "application/json",
cache: false,
dataType: 'json',
data: JSON.stringify(data),
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Basic " + btoa(self.username + ":" + self.password));
},
error: function (jqXHR) {
console.log("ajax error " + jqXHR.status);
}
};
return $.ajax(request);
}
self.ajax(self.tasksURI, 'GET').done(function (data) {
alert(data);
});
重要提示! :如果您启用基本身份验证,您确实应该将您的网站也配置为使用 https,否则您的凭据将以明文形式发送(如上图右上方的警告所示)。
通过 .NET 客户端
在本地(当前为 rtm'd:2015 更新 1)中,api 通常被 NTLM 封闭/隔离,这意味着发出飞行前请求,从服务器返回 401 以挑战身份验证,在这种情况下,如下设置请求 Credential 允许请求在收到预检质询后针对服务器进行身份验证。
为了应对挑战,您可以这样做:
request.Credentials = new NetworkCredential(this.UserName, this.Password);
//you may want to specify a domain too
如果您已为 tfs on prem 启用基本身份验证,则可以尝试如下进行身份验证,此模式与在 ui 中启用替代凭据后调用 vso 时使用的机制相匹配:
request.Headers[HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(this.UserName + ":" + this.Password));
注意:在我几周前修改的一些代码中;需要同时支持 VSO 和本地部署,因此我使用上述两种模式来处理特定场景。