2015-05-08 23 views
19

Po kilku dniach sortowania OAuth2 na końcu serwera (Spring java) zacząłem pracować nad klientem napisanym w języku C#. Używam RestSharp do wywoływania mojego web API, ale mam prawdziwą trudność z OAuth2. Nie ma prawie żadnej dokumentacji i kilka przykładów, które znalazłem online, nie działa. Czy ktoś może dostarczyć mi próbkę kodu, która jest aktualna i którą mogę użyć?Jak używać OAuth2 w RestSharp

tej pory mam następujące:

var client = new RestClient("http://example.com/myapi/oauth/token"); 
RestRequest request = new RestRequest() { Method = Method.POST }; 

request.AddHeader("Content-Type", "application/json"); 
request.AddParameter("grant_type", "client_credentials"); 
request.AddParameter("client_id", "client-app"); 
request.AddParameter("client_secret", "secret"); 

var response = client.Execute(request); 

Ja po prostu działa ten kod w trybie debugowania i gdy patrzę w odpowiedzi dostaję nieuprawnione.

Kiedy robię zwijanie na konsoli z tymi samymi parametrami to działa dobrze, ale wydaje się, że nie mogę sprawić, żeby to działało w C#. Oto curl polecenie:

curl -H "Accept: application/json" client-app:[email protected]/myapi/oauth/token -d grant_type=client_credentials 

Nawiasem mówiąc, mam wymienić moje prawdziwe adresy URL API i inne informacje zastępcze.

+0

Czy można wyświetlić polecenie curl, które działa. –

+0

Dodałem powyższe polecenie curl. – Dimitris

Odpowiedz

33

Zobacz RFC 6749 - 4.4.2. Client Credentials - Access Token Request

Oto podstawowy format (zalecane) żądania

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

grant_type=client_credentials 

Powodem Twojego polecenia cURL działa

  1. Domyślnie Content-Type (jeśli nie podano) z POST (domyślnie, gdy używasz przełącznika -d) jest application/x-www-form-urlencoded
  2. Domyślny typ uwierzytelniania, jeśli nie określono, jest Basic. Osiąga się to z

    -u username:password 
    -or in your case- 
    -u client-app:[email protected]/myapi/oauth/token 
    

    Można również określić typ uwierzytelniania z --basic lub --digest

    Również myślałem przełącznik -u było potrzebne. Nie testowałem, ale jeśli to działa dla ciebie, myślę, że to nie jest potrzebne.

Można użyć przełącznika -v w komendzie cURL, aby zobaczyć wszystkie nagłówki zaangażowanych we wniosku.

RestSharp fix:

  1. Ustaw Content-Type do application/x-www-form-urlencoded

  2. Dodaj Podstawowe uwierzytelnianie

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret"); 
    
  3. pozbyć

    request.AddParameter("client_id", "client-app"); 
    request.AddParameter("client_secret", "secret"); 
    
  4. Ustaw Accept nagłówek do application/json

+2

Dzięki, nic dziwnego, że masz 47K punktów. To działało jak marzenie. Teraz muszę dowiedzieć się, jak odświeżyć token dostępu, kiedy jest to konieczne. – Dimitris

+0

Jaka jest różnica między SimpleAuthenticator i HttpBasicAuthenticator? Czy kodowanie base64 jest wykonywane wewnętrznie? –

4

jestem w stanie dostać zarówno z następujących funkcji pracował.

public RestClient getClient2(string user, string token) 
    { 
     RestClient client = new RestClient(); 
     client.BaseUrl = new Uri(baseUrl); 
     client.Authenticator = new HttpBasicAuthenticator(user, token);     
     //client.Authenticator = new OAuth2UriQueryParameterAuthenticator(token); //works 
     //client.Authenticator = new OAuth2AuthorizationRequestHeaderAuthenticator(token); // doesn't work 

     return client; 
    } 

    public GitHubUser GetGitHubUser2() 
    { 
     RestRequest request = new RestRequest();   
     request.Resource = "https://stackoverflow.com/users/huj"; 
     request.RootElement = "GitHubUser"; 

     RestClient client = getClient2(myUser, myToken); 

     return Execute<GitHubUser>(client, request);   
    } 


    /// <summary> 
    /// http://stackoverflow.com/questions/30133937/how-to-use-oauth2-in-restsharp 
    /// </summary> 
    /// <returns>GitHubUser</returns> 
    public GitHubUser GetGitHubUser3() 
    { 
     //RestRequest request = new RestRequest(Method.POST); //empty data 
     RestRequest request = new RestRequest(); 
     request.AddHeader("Content-Type", "application/x-www-form-urlencoded"); 
     request.AddHeader("Accept", "application/json"); 
     request.AddParameter("grant_type", "client_credentials"); 

     request.Resource = "https://stackoverflow.com/users/huj"; 
     request.RootElement = "GitHubUser"; 

     RestClient client = getClient2(myUser, myToken); 

     return Execute<GitHubUser>(client, request); 
    }