2016-03-17 21 views
11

Chúng tôi đang cố gắng gọi TFS 2015 REST API từ một trang web sử dụng Javascript và có một thách thức trong việc thiết lập xác thực hợp lệ với máy chủ TFS.TFS 2015 REST API Authentication

Chúng tôi không biết cách tạo mã thông báo truy cập cá nhân hoặc mã thông báo truy cập OAuth. Hướng dẫn dưới đây dường như áp dụng nhiều hơn cho VSO so với TFS tại chỗ. https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

Làm cách nào để tạo khóa/mã xác thực?

CẬP NHẬT: Vào tháng 3 năm 2017, bản phát hành mới nhất của TFS hỗ trợ tạo thẻ truy cập cá nhân cho tất cả người dùng. Sử dụng mã javascript dưới đây bằng @Elmar, bạn có thể yêu cầu cập nhật, chỉnh sửa các workwork của TFS từ REST API.

Trả lời

13

Cơ chế OAuth được sử dụng chống lại api VSO tại thời điểm viết bài này khi bạn dường như đã được xác định. official docs for VSO OAuth tokens here.

Đối tại chỗ nhỏ Tuy nhiên, sau đây là cần thiết:

Qua một khách hàng javascript (lưu ý tôi đang sử dụng jquery cho yêu cầu ajax đây)

Kể từ creds thay thế hoặc Token dựa auth isn không có sẵn trên thị trường để phù hợp với thực hiện hiện tại vso; Bạn có thể xem xét cách tiếp cận sau: Nếu bạn có quyền quản trị trên tầng ứng dụng TFS, bạn có thể định cấu hình xác thực cơ bản cho ứng dụng tfs trong IIS và đặt miền mặc định.

enabling basic auth and setting domain

Và sau đó gọi như sau:

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); 

     }); 

LƯU Ý QUAN TRỌNG! : Nếu bạn bật xác thực cơ bản, bạn thực sự nên định cấu hình trang web của mình để sử dụng https quá hoặc thông tin đăng nhập của bạn sẽ được gửi bằng văn bản rõ ràng (như được chỉ ra trong cảnh báo nhìn thấy -> trên cùng bên phải của hình ảnh ở trên).


Qua một khách hàng NET

Trong tại chỗ nhỏ (hiện rtm'd: 2015 cập nhật 1) api thường được gated/rào lại với NTLM, có nghĩa là một yêu cầu trước chuyến bay là thực hiện, 401 trở về từ máy chủ để thử thách auth, trong trường hợp này, đặt yêu cầu Thông tin xác thực như sau cho phép yêu cầu xác thực đối với máy chủ sau khi nhận được thử thách preflight. Để thích ứng với thách thức bạn có thể làm điều này:

request.Credentials = new NetworkCredential(this.UserName, this.Password); 
//you may want to specify a domain too 

Nếu bạn đã kích hoạt auth cơ bản cho TFS dữ liệu tại chỗ, bạn có thể cố gắng chứng thực như sau, mô hình này phù hợp với cơ chế sử dụng khi gọi VSO sau khi kích hoạt thông tin thay thế trong ui:

request.Headers[HttpRequestHeader.Authorization] = "Basic " + Convert.ToBase64String(Encoding.UTF8.GetBytes(this.UserName + ":" + this.Password)); 

Lưu ý: Trong một số mã tôi đã sửa đổi một vài tuần trước; hỗ trợ cho cả VSO và on-prem là bắt buộc vì vậy tôi đã sử dụng hai mẫu trên để xử lý kịch bản cụ thể.

+0

Cảm ơn @Elmar đã chia sẻ câu trả lời của bạn tại đây. Tôi đang viết nhiều kịch bản java, vì vậy tôi đang cố gắng tìm hiểu cách tạo mã thông báo truy cập cá nhân thay cho myPatToken trong tiêu đề yêu cầu "Ủy quyền" như đã đề cập ở đây? 'tiêu đề: { 'Ủy quyền': 'Cơ bản' + btoa (" "+": "+ myPatToken) }' – vikkee

+2

@vikkee vui lòng xem câu trả lời đã sửa đổi. Tôi đã cung cấp thông tin xác thực cơ bản và đoạn mã javascript. như xa như các mã thông báo là có liên quan, tôi bản thân mình muốn nó vào đầu. – Elmar

+0

Cảm ơn nhiều vì cú pháp javascript chi tiết của bạn, tôi không có sự cho phép hoặc ảnh hưởng đối với quản trị viên TFS tại địa điểm của tôi, vì vậy trước tiên tôi cần tìm ra cách để giải quyết nó. Có thể tìm hiểu xem tất cả các loại xác thực đã được quản trị viên bật chưa? – vikkee

0

Nếu có thể, tôi khuyên bạn nên sử dụng.thư viện NET khách hàng cho Visual Studio Team Services (và TFS):

https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/dotnet

Bạn có thể sử dụng cửa sổ xác thực (đó là những gì tôi cần thiết). Sau bao gồm các gói NuGet sau trong mã của tôi:

Microsoft.TeamFoundationServer.Client 
Microsoft.VisualStudio.Services.Client 
Microsoft.VisualStudio.Services.InteractiveClient 

tôi đã có thể viết mã này:

// 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); 
} 

Xem thêm: https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/samples

1

Câu hỏi của tôi là cũ nhưng như trên Tháng 3 năm 2017, bản phát hành mới nhất của On-Prem TFS hỗ trợ tạo mã thông báo truy cập cá nhân cho tất cả người dùng. Sử dụng mã javascript bằng @Elmar, bạn có thể yêu cầu cập nhật, chỉnh sửa các workwork của TFS từ REST API.

+0

Tuyệt vời! Cảm ơn bạn đã phản hồi @vikkee – Elmar