2017-09-28 10 views
0

私はVisual Studio Team Services(VSTS)で私たちの作業項目に問い合わせるためのMVC5 Webアプリケーションを作成しています。認可ルーチンによって提供されたVSTS OAuth2ベアラートークンはどのように使用しますか?

チュートリアルthis onethis oneのようなチュートリアルを実行したところ、開発目的で作成した個人用アクセストークン(PAT)を使用して作業項目を取得できるようにアプリケーションを作成できました。私はまた、利用可能なサンプルhereを綿密に追跡することで、OAuth2プロセス全体を正常に作成し、ユーザーをVSTSに導き、自分のアプリケーションを承認するよう依頼してからコールバックページに戻しました。コールバックURLには、ユーザーのアクセストークン、更新トークンなどが正しく含まれています。ここまでは順調ですね。

アクセストークンの有効期限が切れた後にアプリケーションにアクセスしようとすると、そのトークンをリフレッシュすることを知っているので、ユーザの更新トークンを自分のユーザレコードのデータベースに保存します。

私の問題は、VSTSを照会するためのC#コードで自分のPATの代わりにユーザーのアクセストークンを使用する方法を理解できないことです。私が使用しているコードは以下の通りです(上でリンクしたGitHubのサンプルとほぼ同じです)。うまく動作しますが、PATを使用しているのがわかります。代わりに、ユーザーのアクセストークンを使用する方法はありますか?現時点では、APIによって返されたときにちょうどstringとして扱われています(おそらく間違っていますか?)。

public class GetFeatures 
{ 
    readonly string _uri; 
    readonly string _personalAccessToken; 
    readonly string _project; 

    public GetFeatures() 
    { 
     _uri = "https://myaccount.visualstudio.com"; 
     _personalAccessToken = "abc123xyz456"; //Obviously I've redacted my actual PAT 
     _project = "My Project"; 
    } 

    public List<VSTSFeatureModel> AllFeatures() 
    { 
     Uri uri = new Uri(_uri); 
     string personalAccessToken = _personalAccessToken; 
     string project = _project; 

     VssBasicCredential credentials = new VssBasicCredential("", _personalAccessToken); 

     //create a wiql object and build our query 
     Wiql wiql = new Wiql() 
     { 
      Query = "Select [State], [Title] " + 
        "From WorkItems " + 
        "Where [Work Item Type] = 'Feature' " + 
        "And [System.TeamProject] = '" + project + "' " + 
        "And [System.State] <> 'Removed' " + 
        "Order By [State] Asc, [Changed Date] Desc" 
     }; 

     //create instance of work item tracking http client 
     using (WorkItemTrackingHttpClient workItemTrackingHttpClient = new WorkItemTrackingHttpClient(uri, credentials)) 
     { 
      //execute the query to get the list of work items in the results 
      WorkItemQueryResult workItemQueryResult = workItemTrackingHttpClient.QueryByWiqlAsync(wiql).Result; 

      //some error handling     
      if (workItemQueryResult.WorkItems.Count() != 0) 
      { 
       //...do stuff     
      } 

      return null; 
     } 
    } 
} 

答えて

0

VSTS .NETクライアントライブラリは非常によく文書化されていないので、ちょっと推測すると、VssOAuthCredentialは廃止されているようです。私は

AccessTokenは、ユーザーのOAuthアクセストークンを含む stringある
VssOAuthAccessTokenCredential credentials = new VssOAuthAccessTokenCredential(AccessToken); 

VssBasicCredential credentials = new VssBasicCredential("", _personalAccessToken) 

を置き換えることにより、作業上の私のコードサンプルを入手することができました。フレームワークはハハ、むしろ無用思わ

0

あなたはVssOAuthCredentialの代わりVssBasicCredentialを使用する必要があります。

+0

その場合、私は疑問に思いましたそのようなケースでしたが、クラスが必要とするパラメータを調べると、どの値を渡すべきかわからず、複雑すぎるように見えます。私はユーザーにアクセストークンを持っていますが、私がする必要があるのは、APIへの私の要求にこれを含めることです(「アクセストークンの使用」のセクションを参照してください):https://docs.microsoft.com/en- gb/vsts/integrate/get-started/authentication/oauthのように、.NETクライアントライブラリを使用する方法はありません)。 –

0

...

私は現在、VSTSのアカウントをバックアップするためのプロジェクトに取り組んでいると私は、REST APIにHttpRequestsを通してそれのすべてをやっています。

public List<int> GetItemIDs() 
    { 
     HttpClient client = auth.AuthenticateHTTP(new HttpClient()); 
     string content = [email protected]"{{""query"": ""Select[System.Id] From WorkItems order by[System.CreatedDate] desc"" }}"; 
     StringContent stringContent = new StringContent(content, Encoding.UTF8, "application/json"); 
     string endpoint = "DefaultCollection/_apis/wit/wiql?api-version=1.0"; 
     Uri requesturl = UriCombine(baseurl, endpoint); 
     HttpResponseMessage response = client.PostAsync(requesturl, stringContent).Result; 
     string result = response.Content.ReadAsStringAsync().Result; 
     var json = Newtonsoft.Json.JsonConvert.DeserializeObject<QueryResponse>(result); 
     return json.workItems.Select(x => x.id).ToList(); 
    } 

public List<string> ListToString200(List<int> ids) //Writes all IDs into comma seperated strings of up to 200 IDs and puts them into a List. 
     { 
      List<string> idStrings = new List<string>(); 

      if (ids.Count > 200) 
      { 
       while (ids.Count > 200) 
       { 
        List<int> t = new List<int>(); 
        var IDs = ids.Take(200); 
        ids.Remove(200); 
        foreach (var item in IDs) 
        { 
         t.Add(item); 
        } 

        var ID = t.ConvertAll(element => element.ToString()).Aggregate((a, b) => $"{a},{b}"); 
        idStrings.Add(ID); 
       } 
      } 
      else if (ids.Count > 0) 
      { 
       var ID = ids.ConvertAll(element => element.ToString()).Aggregate((a, b) => $"{a}, {b}"); 
       idStrings.Add(ID); 
      } 

      return idStrings; 
     } 


private List<WorkItem> GetAllWorkItems() 
     { 
      List<int> ids = GetItemIDs(); 
      List<WorkItemsContainer> Responses = new List<WorkItemsContainer>(); 
      List<WorkItem> ResultList = new List<WorkItem>(); 

      List<string> idStrings = ListToString200(ids); 

      using (HttpClient client = new HttpClient()) 
      { 
       auth.AuthenticateHTTP(client); 

       foreach (var item in idStrings) 
       { 
        WorkItemsContainer WorkItem = new WorkItemsContainer(); 

        string featurePath = $"DefaultCollection/_apis/wit/workitems?ids={item}&$expand=all&api-version=1.0"; 
        Uri requestUri = Authenticator.UriCombine(baseurl, featurePath); 
        HttpResponseMessage response = client.GetAsync(requestUri).Result; 
        string result = response.Content.ReadAsStringAsync().Result; 
        result = result.Replace("System.", "System"); 

        WorkItem = JsonConvert.DeserializeObject<WorkItemsContainer>(result); 
        Responses.Add(WorkItem); 
       } 
      } 

      foreach (var item in Responses) 
      { 
       foreach (var x in item.value.ToList<WorkItem>()) 
       { 
        WorkItemsToJsonFile(x); 
        ResultList.Add(x); 
       } 
      } 
      return ResultList; 
     } 

はるかに簡単固定ログインして、手動でのOAuth2を行うことはそれほど困難ではない、が、ちょうどベアラ認証ヘッダーにトークンを回す、のOAuth2を必要としない...

+0

私はREST APIを使い始めたばかりですが、質問を投稿した時点で.NETクライアントライブラリに投資しました!私は最後にそれを働かせました - 私が投稿した答えを見てください。また、私は複数のユーザーが自分のアプリケーションにアクセスすることにして、OAuthを使用したいと思っていました。しかし、OAuthのアクセストークンをAjaxコール(PATで実行できる、アクセストークンを見つけることができない)に正常に渡す方法を教えてもらえれば、私のヒーローになるはずです。 –

+0

PATを聞いたことがないtbh :( HttpClientを使用しているC#では、httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue( "Bearer"、 "Your Oauth token"); – Vaethin

関連する問題