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.
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
- par Défaut
Content-Type
(si non spécifié) avec POST (par défaut lorsque vous utilisez-d
switch) estapplication/x-www-form-urlencoded
-
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:
-
Set
Content-Type
àapplication/x-www-form-urlencoded
-
ajouter l'authentification de base
client.Authenticator = new HttpBasicAuthenticator("client-app", "secret");
-
se débarrasser de
request.AddParameter("client_id", "client-app"); request.AddParameter("client_secret", "secret");
-
définir le
Accept
en-tête deapplication/json
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);
}