Подтвердить что ты не робот

Как использовать OAuth2 в RestSharp

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

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

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

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

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

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

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

4b9b3361

Ответ 1

См. RFC 6749 - 4.4.2. Учетные данные клиента - Запрос токена доступа

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

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

 grant_type=client_credentials

Причина, по которой ваша команда cURL работает

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

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

    Вы также можете указать тип auth с помощью --basic или --digest

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

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

RestSharp:

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

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

    client.Authenticator = new HttpBasicAuthenticator("client-app", "secret");
    
  • Избавьтесь от

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

Ответ 2

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

 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/info/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);
    }