Получите аутентификацию пользователя с помощью браузера с Restsharp и OAUTH

API Khan Academy требует, чтобы пользователь проходил аутентификацию с помощью своего веб-браузера. Вот руководство по аутентификации Академии Хана

При попытке получить токен запроса происходит сбой запроса, потому что сам пользователь его не одобрил.

Вот мой код:

string _server_url = "http://www.khanacademy.org";
string _consumer_key = "key";
string _consumer_secret = "secret";

//Request token
RestClient client = new RestClient();
client.BaseUrl = _server_url;
client.Authenticator = OAuth1Authenticator.ForRequestToken(_consumer_key, _consumer_secret);
RestRequest request = new RestRequest("api/auth/request_token", Method.GET);

var response = client.Execute(request);

var qs = HttpUtility.ParseQueryString(response.Content);
var oauth_token = qs["oauth_token"];
var oauth_token_secret = qs["oauth_token_secret"];

оба oauth_token и oauth_token_secret возвращаются как null.

Есть ли способ запустить браузер и попросить пользователя пройти аутентификацию при использовании RestSharp?


person Omri374    schedule 18.09.2013    source источник


Ответы (1)


В конце концов я использовал объект WebBrowser в WinForms для решения этой проблемы. Вот мой код:

    public Authenticate()
    {
        InitializeComponent();
        //Request token
        Client.BaseUrl = Server_url;
        Client.Authenticator = OAuth1Authenticator.ForRequestToken(Consumer_key, Consumer_secret);
        RestRequest request = new RestRequest("api/auth/request_token", Method.GET);


        //request response
        var response = Client.Execute(request);

        //pull out the google url out of the response (which is a HTML page)
        int index = response.Content.IndexOf("/api/auth/request_token_callback/google/") + "/api/auth/request_token_callback/google/".Length;
        string key = response.Content.Substring(index, 10);
        if (response.StatusDescription.Equals("OK"))
        {
            var url = response.ResponseUri.AbsoluteUri;
            webBrowser.Navigate(new Uri(url));
        }
        else
            throw new Exception();
    }

И когда пользователь завершает аутентификацию через Google/Facebook/Email, я могу вытащить его oauth_token и oauth_token_secret с помощью webBrowser.Url:

            string source = webBrowser.Url.ToString();
            var qs = HttpUtility.ParseQueryString(source);
            var oauth_token_secret = HttpUtility.ParseQueryString(source).Get(0);

            var oauth_token = qs["oauth_token"];
            Client.BaseUrl = Server_url;
            Client.Authenticator = OAuth1Authenticator.ForAccessToken(Consumer_key, Consumer_secret, oauth_token, oauth_token_secret);

Кстати, есть ошибка с HttpUtility.ParseQueryString(source). см. этот пост для решения (это также реализовано здесь)

person Omri374    schedule 22.09.2013