2016-03-17 19 views
11

Staramy się wywoływać interfejsy API REST TFS 2015 ze strony internetowej przy użyciu Javascript i mieć problem z ustanowieniem prawidłowego uwierzytelniania na serwerze TFS.Uwierzytelnienie TFT API REST 2015

Nie wiemy, jak wygenerować osobiste tokeny dostępu lub tokeny dostępu OAuth. Poniższa instrukcja wydaje się bardziej dotyczyć VSO niż lokalnego TFS. https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

Jak mogę wygenerować klucz/token uwierzytelniający?

AKTUALIZACJA: W marcu 2017 r. Najnowsza wersja On-Prem TFS obsługuje tworzenie osobistych tokenów dostępu dla wszystkich użytkowników. Korzystając z poniższego kodu javascript @Elmar, możesz wysyłać żądania aktualizacji, edycji TFS workitems z REST API.

Odpowiedz

13

Mechanizm OAuth jest używany przeciwko apsowi VSO w chwili pisania tego, tak jak się wydaje. official docs for VSO OAuth tokens here.

Dla on-prem jednak wymagane jest:

Via javascript klienta (uwaga używam jQuery dla żądania ajax tutaj)

Od alternatywnych creds lub tokena uwierzytelniania opartego ISN 't dostępny on-prem, aby dopasować bieżącą implementację vso; Możesz rozważyć następujące podejście: Jeśli masz uprawnienia administratora w warstwie aplikacji TFS, możesz skonfigurować podstawowe uwierzytelnianie dla aplikacji tfs w IIS, a ustawić domyślną domenę.

enabling basic auth and setting domain

A potem wywołać następująco:

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

     }); 

WAŻNA UWAGA! : Jeśli włączysz podstawową autoryzację, powinieneś skonfigurować swoją stronę tak, aby używała https, lub twoje dane uwierzytelniające będą wysyłane w postaci czystego tekstu (jak wskazano w ostrzeżeniu -> w prawym górnym rogu powyższego obrazu).


Via klienta .NET

W on-prem (obecnie rtm'd: 2015 Update 1) API jest zazwyczaj zamkniętym/odgrodzony z NTLM, czyli wniosek przed lotem jest wykonane, 401 zwrócone z serwera do wyzwania dla uwierzytelnienia, w tym przypadku ustawienie żądania Credential w następujący sposób umożliwia żądanie uwierzytelnienia się na serwerze po otrzymaniu żądania preflight. Aby sprostać wyzwaniu można to zrobić:

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

Jeśli masz włączone podstawowego uwierzytelniania dla TFS na prem można podjąć próbę uwierzytelniania w następujący sposób, ten wzór pasuje mechanizm wykorzystywany podczas wywoływania VSO po włączeniu alternatywnych poświadczeń w ui:

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

Uwaga: W jakimś kodzie zmodyfikowałem kilka tygodni temu; obsługa VSO i "on-prem" była wymagana, więc zastosowałem dwa powyższe schematy, aby poradzić sobie z konkretnym scenariuszem.

+0

Dzięki @ Elmar za udostępnienie odpowiedzi tutaj. Piszę więcej skryptu java, więc próbuję dowiedzieć się, jak utworzyć token dostępu osobistego zamiast myPatToken w nagłówku żądania "Autoryzacja", jak wspomniano tutaj? 'nagłówki: { 'Autoryzacja': 'Basic' + btoa (" "+": "+ myPatToken) }' – vikkee

+2

@vikkee zobacz zmodyfikowaną odpowiedź. Dostarczyłem podstawowe informacje o autorze i fragment kodu javascript. jeśli chodzi o token, sam chciałbym to zrobić z wyprzedzeniem. – Elmar

+0

Dziękuję za szczegółową składnię javascript, nie mam uprawnień ani wpływu na administratora TFS w moim imieniu, więc muszę najpierw znaleźć sposób obejścia tego. Czy możliwe jest sprawdzenie, jakie rodzaje uwierzytelniania są już włączone przez administratora? – vikkee

0

Jeśli to możliwe, polecam używanie.NET biblioteki klienckie dla Visual Studio Team Services (i TFS):

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

Można używać uwierzytelniania systemu Windows (czyli to, co potrzebne). Po uwzględnieniu następujących pakietach Nuget w moim kodu:

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

udało mi się napisać ten kod:

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

Patrz także: https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/samples

1

Moje pytanie jest stary, ale jak na maj 2017, najnowsza wersja On-Prem TFS obsługuje tworzenie osobistych tokenów dostępu dla wszystkich użytkowników. Korzystając z kodu javascript @Elmar, możesz wysyłać żądania aktualizacji, edycji TFS workitems z REST API.

+0

Świetnie! Dzięki za informację @vikkee – Elmar