web-dev-qa-db-fra.com

Comment utiliser OAuth2 dans RestSharp

Après quelques jours à trier OAuth2 côté serveur (Spring Java), j'ai commencé à travailler sur le client écrit en C #. J'utilise RestSharp pour appeler mon API Web, mais j'ai de réelles difficultés avec OAuth2. Il n'y a pratiquement pas de documentation et les quelques exemples que j'ai trouvés en ligne ne fonctionnent pas. Quelqu'un peut-il me fournir un exemple de code à jour et que je peux utiliser?

Jusqu'à présent, j'ai les éléments suivants:

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

J'exécute simplement ce code en mode débogage et lorsque je regarde la réponse, je ne suis pas autorisé.

Quand je boucle sur la console avec les mêmes paramètres, cela fonctionne bien, mais il semble que je ne puisse pas faire fonctionner cela en C #. Voici la commande curl:

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

Soit dit en passant, j'ai remplacé mes véritables URL d'API et d'autres informations par des espaces réservés.

27
Dimitris

Voir RFC 6749 - 4.4.2. Informations d'identification client - Demande de jeton d'accès

Voici le format de base de la demande

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

grant_type=client_credentials

Votre demande cURL

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

La raison pour laquelle votre commande cURL fonctionne

  1. Défaut Content-Type (si non spécifié) avec POST (par défaut lorsque vous utilisez -d switch) est application/x-www-form-urlencoded
  2. Le type d'authentification par défaut, s'il n'est pas spécifié, est De base . Le nom d'utilisateur et le mot de passe sont transmis via le -u option ou dans l'URL

    -u username:password (client-app:secret)
    
    -- or put it in the url --
    
    client-app:[email protected]/myapi/oauth/token
    

    Vous pouvez également spécifier le type d'authentification avec --basic ou --digest

Vous pouvez utiliser le -v basculez dans votre commande cURL pour voir tous les en-têtes impliqués dans la demande.

Correction RestSharp :

  1. Met le Content-Type à application/x-www-form-urlencoded

  2. Ajoutez l'authentification de base

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret");
    
  3. Se débarrasser de

    request.AddParameter("client_id", "client-app");
    request.AddParameter("client_secret", "secret");
    
  4. Définissez l'en-tête Accept sur application/json

47
Paul Samsotha

Je peux faire fonctionner les deux fonctions suivantes.

 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 = "/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 = "/users/huj";
        request.RootElement = "GitHubUser";

        RestClient client = getClient2(myUser, myToken);

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