TFS 2015 REST API 身份验证
TFS 2015 REST API Authentication
我们正在尝试使用 Javascript 从网页调用 TFS 2015 REST API,并且在与 TFS 服务器建立有效身份验证方面遇到挑战。
我们不知道如何生成个人访问令牌或 OAuth 访问令牌。下面的说明似乎比本地 TFS 更适用于 VSO。
https://www.visualstudio.com/en-us/integrate/get-started/rest/basics
如何生成身份验证 key/token?
更新:截至 2017 年 3 月,最新版本的 On-Prem TFS 支持为所有用户创建个人访问令牌。使用@Elmar 的以下 javascript 代码,您可以请求更新,从 REST API 编辑 TFS 工作项。
在撰写本文时,OAuth 机制已用于 VSO api,正如您似乎已经确定的那样。 official docs for VSO OAuth tokens here。
然而,对于本地部署,以下是 required:
通过 javascript 客户端(注意我在这里使用 jquery 作为 ajax 请求)
由于替代信用或基于令牌的身份验证在本地不可用以匹配当前的 vso 实施;可以考虑以下做法:如果你有TFS应用层的admin权限,可以在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 通常 gated/fenced 关闭 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 和本地部署的支持是 required 所以我使用上面的两种模式来处理特定场景。
如果可能,我建议使用 .NET 客户端库 Visual Studio Team Services(和 TFS):
https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/dotnet
您可以使用 windows 身份验证(这是我需要的)。在我的代码中包含以下 nuget 包后:
Microsoft.TeamFoundationServer.Client
Microsoft.VisualStudio.Services.Client
Microsoft.VisualStudio.Services.InteractiveClient
我能够编写这段代码:
// Create instance of VssConnection using Windows credentials (NTLM)
var connection = new VssConnection(new Uri("http://mytfsserver:8080/tfs/CollectionName"), new VssClientCredentials());
// Create instance of WorkItemTrackingHttpClient using VssConnection
var gitClient = connection.GetClient<GitHttpClient>();
var items = gitClient.GetRepositoriesAsync().Result;
foreach (var item in items)
{
Console.WriteLine(item.Name);
}
另请参阅:https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/samples
我的问题是旧问题,但截至 2017 年 3 月,最新版本的 On-Prem TFS 支持为所有用户创建个人访问令牌。使用@Elmar 的 javascript 代码,您可以请求从 REST API 更新、编辑 TFS 工作项。
我们正在尝试使用 Javascript 从网页调用 TFS 2015 REST API,并且在与 TFS 服务器建立有效身份验证方面遇到挑战。
我们不知道如何生成个人访问令牌或 OAuth 访问令牌。下面的说明似乎比本地 TFS 更适用于 VSO。 https://www.visualstudio.com/en-us/integrate/get-started/rest/basics
如何生成身份验证 key/token?
更新:截至 2017 年 3 月,最新版本的 On-Prem TFS 支持为所有用户创建个人访问令牌。使用@Elmar 的以下 javascript 代码,您可以请求更新,从 REST API 编辑 TFS 工作项。
在撰写本文时,OAuth 机制已用于 VSO api,正如您似乎已经确定的那样。 official docs for VSO OAuth tokens here。
然而,对于本地部署,以下是 required:
通过 javascript 客户端(注意我在这里使用 jquery 作为 ajax 请求)
由于替代信用或基于令牌的身份验证在本地不可用以匹配当前的 vso 实施;可以考虑以下做法:如果你有TFS应用层的admin权限,可以在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 通常 gated/fenced 关闭 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 和本地部署的支持是 required 所以我使用上面的两种模式来处理特定场景。
如果可能,我建议使用 .NET 客户端库 Visual Studio Team Services(和 TFS):
https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/dotnet
您可以使用 windows 身份验证(这是我需要的)。在我的代码中包含以下 nuget 包后:
Microsoft.TeamFoundationServer.Client
Microsoft.VisualStudio.Services.Client
Microsoft.VisualStudio.Services.InteractiveClient
我能够编写这段代码:
// Create instance of VssConnection using Windows credentials (NTLM)
var connection = new VssConnection(new Uri("http://mytfsserver:8080/tfs/CollectionName"), new VssClientCredentials());
// Create instance of WorkItemTrackingHttpClient using VssConnection
var gitClient = connection.GetClient<GitHttpClient>();
var items = gitClient.GetRepositoriesAsync().Result;
foreach (var item in items)
{
Console.WriteLine(item.Name);
}
另请参阅:https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/samples
我的问题是旧问题,但截至 2017 年 3 月,最新版本的 On-Prem TFS 支持为所有用户创建个人访问令牌。使用@Elmar 的 javascript 代码,您可以请求从 REST API 更新、编辑 TFS 工作项。