c# - restresponse - Cómo usar OAuth2 en RestSharp
restsharp github (2)
Soy capaz de hacer funcionar las dos funciones siguientes.
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);
}
Después de un par de días clasificando OAuth2 en el servidor (Spring Java) comencé a trabajar en el cliente escrito en C #. Estoy usando RestSharp para llamar a mi API web pero tengo una verdadera dificultad con OAuth2. Casi no hay documentación y los pocos ejemplos que encontré en línea no funcionan. ¿Puede alguien proporcionarme un ejemplo de código que esté actualizado y que yo pueda usar?
Hasta ahora tengo lo siguiente:
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);
Simplemente estoy ejecutando este código en modo de depuración y cuando veo la respuesta, no estoy autorizado.
Cuando hago curl en la consola con los mismos parámetros, funciona bien, pero parece que no puedo hacer que esto funcione en C #. Aquí está el comando curl:
curl -H "Accept: application/json" client-app:[email protected]/myapi/oauth/token -d grant_type=client_credentials
Por cierto, he reemplazado mis URL verdaderas de API y otra información con marcadores de posición.
Ver RFC 6749 - 4.4.2. Credenciales del cliente - Solicitud de token de acceso
Aquí está el formato básico de la solicitud.
POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
Su solicitud de cURL
curl -H "Accept: application/json" /
-d grant_type=client_credentials /
client-app:[email protected]/myapi/oauth/token
La razón por la que funciona tu comando cURL
- El tipo de
Content-Type
predeterminado (si no se especifica) con POST (el valor predeterminado cuando usa el-d
) esapplication/x-www-form-urlencoded
El tipo de autenticación predeterminado, si no se especifica, es Basic . El nombre de usuario y la contraseña se pasan a través de la opción
-u
o en la URL-u username:password (client-app:secret) -- or put it in the url -- client-app:[email protected]/myapi/oauth/token
También puede especificar el tipo de autenticación con
--basic
o--digest
Puede usar el -v
en su comando cURL para ver todos los encabezados involucrados en la solicitud.
Solución RestSharp :
Establezca el tipo de
Content-Type
enapplication/x-www-form-urlencoded
Agrega la autenticación básica
client.Authenticator = new HttpBasicAuthenticator("client-app", "secret");
Deshacerse de
request.AddParameter("client_id", "client-app"); request.AddParameter("client_secret", "secret");
Establezca el encabezado
Accept
enapplication/json