2015-05-08 2 views
19

После нескольких дней сортировки OAuth2 на сервере (Spring java) Я начал работать с клиентом, написанным на C#. Я использую RestSharp для вызова моего веб-API, но у меня возникают настоящие трудности с OAuth2. Вряд ли есть какая-либо документация, и несколько примеров, которые я нашел в Интернете, не работают. Может ли кто-нибудь предоставить мне образец кода, который обновлен и что я могу использовать?Как использовать OAuth2 в RestSharp

До сих пор у меня есть следующий:

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

Я просто работаю этот код в режиме отладки, и когда я смотрю в ответ я получаю несанкционированным.

Когда я делаю завиток на консоли с теми же параметрами, он отлично работает, но, похоже, я не могу заставить это работать на C#. Вот локон команда:

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

Кстати, я заменил мой истинный URLs API и другую информацию заполнителей.

+0

Можете ли вы показать команду curl, которая работает. –

+0

Я добавил команду curl выше. – Dimitris

ответ

33

См RFC 6749 - 4.4.2. Client Credentials - Access Token Request

Вот основной (рекомендуется) Формат запроса

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

grant_type=client_credentials 

Причина ваша Curl команда работает

  1. По умолчанию Content-Type (если не указано) с POST (если вы используете -d переключатель) application/x-www-form-urlencoded
  2. Тип аутентификации по умолчанию, если не указан, является основным. Это достигается с помощью

    -u username:password 
    -or in your case- 
    -u client-app:[email protected]/myapi/oauth/token 
    

    Можно также указать тип аутентификации с --basic или --digest

    Кроме того, я думал, что был нужен переключатель -u. Не тестировали, но если это сработает для вас, я думаю, это не нужно.

Вы можете использовать переключатель -v в вашей Curl команды, чтобы увидеть все заголовки, участвующих в запросе.

RestSharp фикс:

  1. Установите Content-Type в application/x-www-form-urlencoded

  2. Добавьте обычную проверку подлинности

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret"); 
    
  3. избавиться от

    request.AddParameter("client_id", "client-app"); 
    request.AddParameter("client_secret", "secret"); 
    
  4. Установите Accept заголовок application/json

+2

Спасибо, неудивительно, что у вас есть 47K очков. Это работало как сон. Теперь мне нужно выяснить, как обновить токен доступа, когда мне это нужно. – Dimitris

+0

В чем разница между SimpleAuthenticator и HttpBasicAuthenticator? Также кодируется base64 внутри? –

4

Я могу получить оба из следующих функций работал.

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

     RestClient client = getClient2(myUser, myToken); 

     return Execute<GitHubUser>(client, request); 
    } 
Смежные вопросы