2015-05-08 17 views
19

Dopo un paio di giorni di smistamento di OAuth2 sul server-end (Spring java) ho iniziato a lavorare sul client scritto in C#. Sto usando RestSharp per chiamare la mia web API ma sto avendo difficoltà reali con OAuth2. Non c'è quasi nessuna documentazione e i pochi esempi che ho trovato online non funzionano. Qualcuno può fornirmi un esempio di codice che è aggiornato e che posso usare?Come utilizzare OAuth2 in RestSharp

Finora ho il seguente:

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

Sono semplicemente eseguire il codice in modalità debug e quando guardo nella risposta ottengo non autorizzata.

Quando eseguo il curl sulla console con gli stessi parametri, funziona bene ma sembra che non riesca a farlo funzionare in C#. Ecco il comando ricciolo:

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

A proposito, ho sostituito i miei veri urls API e altre informazioni con i segnaposto.

+0

Puoi mostrare il comando di arricciatura che funziona. –

+0

Ho aggiunto il comando di arricciatura sopra. – Dimitris

risposta

33

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

Ecco il formato di base (consigliata) della richiesta

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

grant_type=client_credentials 

Il motivo per il vostro comando CURL funziona

  1. default Content-Type (se non specificato) con POST (predefinito quando si utilizza lo switch -d) è application/x-www-form-urlencoded
  2. Il tipo di autenticazione predefinito, se non specificato, è di base. Questo risultato è ottenuto con

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

    Si potrebbe anche specificare il tipo di autenticazione con --basic o --digest

    Inoltre, ho pensato che era necessario l'interruttore -u. Non ho provato, ma se funziona per te, immagino che non sia necessario.

È possibile utilizzare l'opzione -v nel comando cURL per vedere tutte le intestazioni coinvolti nella richiesta.

RestSharp fix:

  1. Impostare il Content-Type a application/x-www-form-urlencoded

  2. Aggiungi l'autenticazione di base

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret"); 
    
  3. Sbarazzarsi della

    request.AddParameter("client_id", "client-app"); 
    request.AddParameter("client_secret", "secret"); 
    
  4. Impostare il Accept intestazione per application/json

+2

Grazie, non mi meraviglia che tu abbia 47K punti. Questo ha funzionato come un sogno. Ora ho bisogno di capire come aggiornare il token di accesso quando è necessario. – Dimitris

+0

Qual è la differenza tra SimpleAuthenticator e HttpBasicAuthenticator? Inoltre, la codifica base64 viene eseguita internamente? –

4

io sono in grado di ottenere entrambe le seguenti funzioni lavorato.

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