web-dev-qa-db-ja.com

TFS 2015 REST API認証

Javascriptを使用してWebページからTFS 2015 REST APIを呼び出すことを試みており、TFSサーバーとの有効な認証の確立に課題があります。

個人用のアクセストークンまたはOAuthアクセストークンを生成する方法がわかりません。以下の手順は、オンプレミスTFSよりもVSOに多く適用されるようです。 https:// www .visualstudio.com/en-us/integrate/get-started/rest/basics

認証キー/トークンを生成するにはどうすればよいですか?

更新:2017年3月と同様、On-Prem TFSの最新リリースでは、すべてのユーザーの個人用アクセストークンの作成がサポートされています。 @Elmarによる以下のJavaScriptコードを使用すると、REST APIからTFS作業項目を編集、編集する要求を行うことができます。

12
vikkee

OAuthメカニズムは、これを書いている時点ではVSO APIに対して使用されているようです。 VSOの公式ドキュメントOAuth tokensここ

ただし、オンプレミスの場合は、次のものが必要です。

javascriptクライアント経由(ここでは、ajaxリクエストにjqueryを使用していることに注意してください)

現在のvso実装と一致する代替クレデンシャルまたはトークンベースの認証はオンプレミスでは利用できないため。次のアプローチを検討できます。TFSアプリ層の管理者権限がある場合、IISでtfsアプリケーションの基本認証を構成し、デフォルトドメインを設定できます

enabling basic auth and setting domain

次に、次のように呼び出します。

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クライアント経由

オンプレミス(現在はrtm'd:2015 update 1)では、APIは通常NTLMでゲート/フェンスされます。つまり、プリフライト要求が行われ、サーバーから401が認証のためのチャレンジに返されます。この場合、リクエストが設定されます。 Credential次のように、プリフライトチャレンジが受信されると、リクエストはサーバーに対して認証されます。課題に対応するには、次のようにします。

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

Premでtfsの基本認証を有効にした場合、次のように認証を試みることができます。このパターンは、UIで別の認証情報を有効にした後でvsoを呼び出すときに使用されるメカニズムと一致します。

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

注:一部のコードでは、数週間前に変更しました。 VSOとオンプレミスの両方のサポートが必要だったので、上記の2つのパターンを使用して特定のシナリオに対処しました。

13
Elmar

私の質問は古いですが、2017年3月と同様に、On-Prem TFSの最新リリースは、すべてのユーザーの個人アクセストークンの作成をサポートしています。 @ElmarによるJavaScriptコードを使用すると、REST APIからTFS作業項目を更新、編集するように要求できます。

2
vikkee

可能であれば、Visual Studio Team Services(およびTFS)に.NETクライアントライブラリを使用することをお勧めします。

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

1
Trevor