Comment utiliser OAuth2 dans RestSharp

après quelques jours à trier OAuth2 à la fin du serveur (java de printemps) 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 aucune 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 qui est à jour et que je peux utiliser?

jusqu'à présent j'ai le suivant:

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

je suis simplement j'exécute ce code en mode debug et quand je regarde la réponse je ne suis pas autorisé.

quand je fais curl sur la console avec les mêmes paramètres, ça marche très bien mais il semble que je ne puisse pas faire ça pour fonctionner en C#. Voici la commande curl:

curl -H "Accept: application/json" client-app:secret@example.com/myapi/oauth/token -d grant_type=client_credentials

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

20
demandé sur Dimitris 2015-05-09 01:46:47

2 réponses

voir RFC 6749-4.4.2. Justificatifs D'Identité Du Client-Demande De Token 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 de boucle

curl -H "Accept: application/json" \
     -d grant_type=client_credentials \
     client-app:secret@example.com/myapi/oauth/token 

la raison pour laquelle votre commande cURL fonctionne

  1. par 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 Basic . Le nom d'utilisateur et le mot de passe sont passés soit par l'option -u soit par L'URL

    -u username:password (client-app:secret)
    
    -- or put it in the url --
    
    client-app:secret@example.com/myapi/oauth/token
    

    vous pouvez également spécifier le type d'autorisation avec --basic ou --digest

vous pouvez utiliser le commutateur -v dans votre commande cURL pour voir tous les en-têtes impliqués dans la requête.

RestSharp fix:

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

  2. ajouter 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éfinir le Accept en-tête de application/json

40
répondu Paul Samsotha 2018-08-17 06:09:23

je suis capable de 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>
    /// /q/how-to-use-oauth2-in-restsharp-30407/"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
répondu Jirong Hu 2016-04-29 18:29:34