Аутентификация API REST TFS 2015

Мы пытаемся вызвать API-интерфейс REST TFS 2015 с веб-страницы, используя Javascript, и имеем проблему с установкой действительной аутентификации на сервере TFS.

Мы не знаем, как сгенерировать токены личного доступа или токены OAuth. Представленная ниже инструкция, похоже, больше относится к VSO, чем к локальной TFS. https://www.visualstudio.com/en-us/integrate/get-started/rest/basics

Как я могу сгенерировать ключ / токен аутентификации?

ОБНОВЛЕНИЕ: Как и в марте 2017 года, последний выпуск On-Prem TFS поддерживает создание персональных токенов доступа для всех пользователей. Используя приведенный ниже код javascript от @Elmar, вы можете отправлять запросы на обновление, редактировать рабочие элементы TFS из REST API.

3 ответа

Решение

Механизм OAuth используется против API VSO во время написания этого, как вы, по-видимому, идентифицировали. официальные документы для токенов VSO OAuth здесь.

Для предварительной встречи, однако, требуется следующее:

Через клиент javascript (обратите внимание, что я использую jquery для запроса ajax здесь)

Поскольку альтернативные кредиты или аутентификация на основе токенов не доступны в предварительном порядке для соответствия текущей реализации vso; Можно рассмотреть следующий подход: если у вас есть права администратора на уровне приложений TFS, вы можете настроить базовую аутентификацию для приложения tfs в IIS и установить домен по умолчанию.

включение базовой аутентификации и настройка домена

И затем вызовите следующее:

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

В on-prem (в настоящее время rtm'd: обновление 2015 года 1) API обычно закрывается / отгораживается с помощью NTLM, что означает запрос перед полетом, 401 возвращается с сервера для запроса на аутентификацию, в данном случае установка запроса Учетные данные, как указано ниже, позволяют выполнить запрос на проверку подлинности на сервере после получения предварительного запроса. Для решения этой проблемы вы можете сделать это:

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

Если вы включили базовую аутентификацию для tfs на прем, вы можете попытаться выполнить аутентификацию следующим образом, этот шаблон соответствует механизму, используемому при вызове vso после включения альтернативных учетных данных в пользовательском интерфейсе:

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

Примечание: в некотором коде я изменил несколько недель назад; Требовалась поддержка как VSO, так и on-prem, поэтому я использовал два вышеприведенных шаблона, чтобы разобраться с конкретным сценарием.

Мой вопрос старый, но, как и в марте 2017 года, последний выпуск On-Prem TFS поддерживает создание персональных токенов доступа для всех пользователей. Используя код JavaScript от @Elmar, вы можете отправлять запросы на обновление, редактировать рабочие элементы TFS из REST API.

Если возможно, я бы рекомендовал использовать клиентские библиотеки.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

Другие вопросы по тегам