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.
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
Content-Type
(si non spécifié) avec POST (par défaut lorsque vous utilisez -d
switch) est application/x-www-form-urlencoded
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 :
Met le Content-Type
à application/x-www-form-urlencoded
Ajoutez 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éfinissez l'en-tête Accept
sur application/json
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);
}