web-dev-qa-db-fra.com

TFS 2015 REST Authentification API

Nous essayons d'appeler les API REST TFS 2015 à partir d'une page Web utilisant Javascript et nous avons du mal à établir une authentification valide avec le serveur TFS. 

Nous ne savons pas comment générer un jeton d'accès personnel ou un jeton d'accès OAuth. Les instructions ci-dessous semblent s’appliquer davantage à VSO qu'à TFS sur site. https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

Comment puis-je générer une clé/un jeton d'authentification? 

MISE À JOUR: À compter de mars 2017, la dernière version de On-Prem TFS prend en charge la création de jetons d'accès personnel pour tous les utilisateurs. En utilisant le code javascript ci-dessous de @Elmar, vous pouvez demander à mettre à jour, éditer des éléments de travail TFS à partir de l'API REST. 

11
vikkee

Le mécanisme OAuth est utilisé contre l'API VSO au moment de la rédaction de ce document, comme vous l'avez apparemment identifié. docs officiels pour les jetons VSO OAuth ici

Pour les visites sur site, cependant, les éléments suivants sont requis:

Via un client javascript (note: j'utilise jquery pour la requête ajax ici)

Puisque les crédits alternatifs ou les autorisations basées sur des jetons ne sont pas disponibles sur site pour correspondre à la mise en œuvre actuelle de vso; Vous pouvez envisager l'approche suivante: Si vous disposez d'autorisations d'administrateur sur le niveau d'application TFS, vous pouvez configurer l'authentification de base pour l'application tfs dans IIS et définir le domaine par défaut.

 enabling basic auth and setting domain

Et puis invoquer comme suit:

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

        });

NOTE IMPORTANTE! : Si vous activez l'authentification de base, vous devez configurer votre site pour qu'il utilise également https, sinon vos informations d'identification seront envoyées en texte clair (comme indiqué dans l'avertissement affiché -> en haut à droite de l'image ci-dessus).


Via un client .NET

Sur site (actuellement à la mise à jour: 2015 mise à jour 1), l’API est généralement fermée/fermée avec NTLM, ce qui signifie qu’une demande de pré-vol est effectuée, 401 sont renvoyés du serveur pour être interrogés pour autorisation, Credential comme suit permet à la demande de s'authentifier sur le serveur une fois que le défi de contrôle en amont est reçu . Pour répondre au défi, vous pouvez procéder comme suit:

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

Si vous avez activé l'authentification de base pour tfs on prem, vous pouvez procéder à l'authentification de la manière suivante. Ce modèle correspond au mécanisme utilisé lors de l'appel de vso après l'activation d'autres informations d'identification dans l'interface utilisateur.

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

Remarque: Dans certains codes que j'ai modifiés il y a quelques semaines; la prise en charge de VSO et sur site était nécessaire; j'ai donc utilisé les deux modèles ci-dessus pour traiter le scénario spécifique.

13
Elmar

Ma question est ancienne, mais depuis mars 2017, la dernière version de On-Prem TFS prend en charge la création de jetons d'accès personnel pour tous les utilisateurs. En utilisant le code javascript de @Elmar, vous pouvez demander à mettre à jour, modifier les éléments de travail TFS à partir de l’API REST. 

2
vikkee

Si possible, je vous recommanderais d'utiliser les bibliothèques clientes .NET pour Visual Studio Team Services (et TFS):

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

Vous pouvez utiliser l'authentification Windows (c'est ce dont j'avais besoin). Après avoir inclus les paquets de nuget suivants dans mon code:

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

J'ai pu écrire ce code:

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

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

0
Trevor