2016-03-17 27 views
11

Si sta tentando di richiamare le API REST di TFS 2015 da una pagina Web utilizzando Javascript e si è in difficoltà nello stabilire un'autenticazione valida con il server TFS.Autenticazione API REST TFS 2015

Non sappiamo come generare token di accesso personali o token di accesso OAuth. Le istruzioni sottostanti sembrano rivolgersi più a VSO che a TFS on-premise. https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

Come posso generare una chiave/token di autenticazione?

AGGIORNAMENTO: come a marzo 2017, l'ultima versione di On-Prem TFS supporta la creazione di token di accesso personali per tutti gli utenti. Usando il codice javascript sottostante da @Elmar puoi effettuare richieste di aggiornamento, modificare i workitems TFS dall'API REST.

risposta

13

Il meccanismo OAuth viene utilizzato contro l'API VSO al momento della scrittura di questo come apparentemente identificato. official docs for VSO OAuth tokens here.

Per on-prem tuttavia, è richiesta la seguente:

tramite un client javascript (nota sto usando jQuery per la richiesta Ajax qui)

Dal creds alternative o gettone ISN autenticazione basata 'disponibile on-prem per adeguarsi all'attuale implementazione vso; È possibile considerare il seguente approccio: Se si dispone delle autorizzazioni di amministratore sul livello dell'app TFS, è possibile configurare l'autenticazione di base per l'applicazione tfs in IIS e impostare il dominio predefinito.

enabling basic auth and setting domain

E quindi richiamare come segue:

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

     }); 

NOTA IMPORTANTE! : Se abiliti l'autenticazione di base dovresti davvero configurare il tuo sito per l'uso di https o le tue credenziali verranno inviate in chiaro (come indicato nell'avviso visto -> in alto a destra dell'immagine sopra).


Via un client .NET

Nel on-prem (attualmente rtm'd: Aggiornamento 2015 1) L'API è generalmente gated/recintata con NTLM, il che significa una richiesta di pre-volo è reso, 401 restituito dal server alla richiesta di autenticazione, in questo caso, l'impostazione della richiesta Credenziali come segue consente la richiesta di autenticazione sul server una volta ricevuta la verifica preflight. Per accogliere la sfida si può fare questo:

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

Se hai attivato autenticazione di base per TFS su prem è possibile tentare l'autenticazione come segue questo criterio identifica il meccanismo utilizzato quando si richiama VSO dopo aver abilitato credenziali alternative in ui:

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

Nota: In un certo codice che ho modificato un paio di settimane fa; era necessario il supporto per VSO e on-prem, quindi ho utilizzato i due modelli sopra per gestire lo scenario specifico.

+0

Grazie a @Elmar per condividere le tue risposte qui. Sto scrivendo più di java script, quindi sto cercando di scoprire come creare il token di accesso personale al posto di myPatToken nell'intestazione della richiesta "Autorizzazione" come menzionato qui? 'intestazioni: { 'Autorizzazione': 'Base' + btoa (" "+": "+ myPatToken) }' – vikkee

+2

@vikkee si prega di consultare la risposta modificata. Ho fornito informazioni di base sull'autent e uno snippet di javascript. per quanto riguarda il token, io stesso mi piacerebbe su prem. – Elmar

+0

Grazie per la tua sintassi javascript dettagliata, non ho il permesso o l'influenza sull'amministratore TFS al mio posto, quindi ho bisogno di trovare un modo per aggirarlo. È possibile scoprire quali tipi di autenticazione sono già abilitati dall'amministratore? – vikkee

0

Se possibile, mi consiglia di utilizzare il.librerie NET client per Visual Studio Team Services (e TFS):

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

È possibile utilizzare l'autenticazione di Windows (che è quello che mi serviva). Dopo aver incluso i seguenti pacchetti Nuget nel mio codice:

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

sono stato in grado di scrivere questo codice:

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

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

1

La mia domanda è vecchia, ma come il mar 2017, l'ultima versione di On-Prem TFS supporta la creazione di token di accesso personali per tutti gli utenti. Utilizzando il codice javascript di @Elmar è possibile effettuare richieste di aggiornamento, modificare i workitems TFS dall'API REST.

+0

Eccellente! Grazie per il feedback @vikkee – Elmar