Android OAuth: исключение при извлеченииAccessToken () - PullRequest
8 голосов
/ 15 июля 2010

Я настраиваю OAuth для своего приложения для Android.Чтобы проверить это, я сделал следующее: добавил в свой проект signpost-core-1.2.1.1.jar и signpost-commonshttp4-1.2.1.1.jar, добавил переменные «CommonsHttpOAuthConsumer consumer» и «CommonsHttpOAuthProvider provider» и сделал следующеенажата кнопка:

consumer = new CommonsHttpOAuthConsumer("xxx", "yyy");
provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", 
                    "https://api.twitter.com/oauth/access_token", 
                    "https://api.twitter.com/oauth/authorize");

oauthUrl = provider.retrieveRequestToken(consumer, "myapp://twitterOauth");
persistOAuthData();
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(oauthUrl)));

persistOAuthData () выполняет следующие действия:

protected void persistOAuthData()
{
    try
    {
        FileOutputStream providerFOS = this.openFileOutput("provider.dat", MODE_PRIVATE);
        ObjectOutputStream providerOOS = new ObjectOutputStream(providerFOS);
        providerOOS.writeObject(this.provider);
        providerOOS.close();

        FileOutputStream consumerFOS = this.openFileOutput("consumer.dat", MODE_PRIVATE);
        ObjectOutputStream consumerOOS = new ObjectOutputStream(consumerFOS);
        consumerOOS.writeObject(this.consumer);
        consumerOOS.close();
    }
    catch (Exception e) { }
}

Таким образом, потребитель и поставщик сохраняются перед открытием браузера, как описано здесь 1008 *.

В методе onResume () я загружаю данные поставщика и потребителя и делаю следующее:

    Uri uri = this.getIntent().getData();
    if (uri != null && uri.getScheme().equals("myapp") && uri.getHost().equals("twitterOauth"))
    {
        verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
        if (!verifier.equals(""))
        {
            loadOauthData();
            try
            {
                provider.retrieveAccessToken(consumer, verifier);
            }
            catch (OAuthMessageSignerException e) {
                e.printStackTrace();
            } catch (OAuthNotAuthorizedException e) {
                e.printStackTrace();
            } catch (OAuthExpectationFailedException e) {
                e.printStackTrace();
            } catch (OAuthCommunicationException e) {
                e.printStackTrace();
            }            
        }
    }

Итак, что работает: 1) Я получаю requestToken и arequestSecret.2) Я получаю oauthUrl.3) Я направлен на страницу браузера для авторизации моего приложения. 4) Я перенаправлен в свое приложение.5) Я получаю верификатор.Но при вызове retrieveAccessToken (потребитель, верификатор) возникает ошибка OAuthCommunicationException, в которой говорится: «Не удалось установить связь с поставщиком услуг: ноль».

Кто-нибудь знает, в чем может быть причина?Некоторые люди, кажется, испытывают проблемы с получением requestToken, но это просто отлично работает.Интересно, может быть проблема в том, что мое приложение также включает в себя apache-mime4j-0.6.jar и httpmime-4.0.1.jar, которые мне нужны для многочастной загрузки.

Ответы [ 2 ]

13 голосов
/ 15 июля 2010

Хорошо, я понял это.Может быть, это полезно для других:

Прежде всего, вам не нужно сохранять весь объект потребителя и поставщика.Все, что вам нужно сделать, это сохранить requestToken и requestSecret.К счастью, это строки, поэтому вам не нужно записывать их на диск или что-то еще.Просто сохраните их в sharedPreferences или что-то в этом роде.

Теперь, когда вы перенаправлены браузером и вызывается метод onResume (), просто выполните следующее:теперь вы можете получить токен и секрет с помощью getToken () и getTokenSecret ().

0 голосов
/ 15 июля 2010

Привет, Мануэль, я вижу, что тебя тоже избегают в Автокалипсисе!Вот хороший пример реализации OAuth для Twitter с использованием sharedPreferences для сохранения requestToken и requestSecret, как ваше решение.http://github.com/brione/Brion-Learns-OAuth от Brion Emde

вот видео

надеюсь, что это поможет другим разработчикам =)

...