Android OAuth: Исключение на retrieveAccessToken ()

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

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) { }
}

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

В 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 и requestSecret. 2) я действительно получаю oauthUrl. 3) я предписан к странице браузера авторизовать свое приложение 4), я становлюсь перенаправленным к своему приложению. 5) я действительно получаю верификатор. Но звоня retrieveAccessToken (потребитель, верификатор) сбои с OAuthCommunicationException, говоря "Связь с поставщиком услуг перестали работать: пустой указатель".

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

8
задан Community 23 May 2017 в 11:58
поделиться

2 ответа

Хорошо, я разобрался. Возможно, это будет полезно другим:

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

Теперь, когда браузер перенаправит вас и вызовет ваш метод onResume(), просто сделайте следующее:

//The consumer object was lost because the browser got into foreground, need to instantiate it again with your apps token and secret.
consumer = new CommonsHttpOAuthConsumer("xxx", "yyy"); 

//Set the requestToken and the tokenSecret that you got earlier by calling retrieveRequestToken.
consumer.setTokenWithSecret(requestToken, tokenSecret);

//The provider object is lost, too, so instantiate it again.
provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", 
                                "https://api.twitter.com/oauth/access_token", 
                                "https://api.twitter.com/oauth/authorize");     
//Now that's really important. Because you don't perform the retrieveRequestToken method at this moment, the OAuth method is not detected automatically (there is no communication with Twitter). So, the default is 1.0 which is wrong because the initial request was performed with 1.0a.
provider.setOAuth10a(true);

provider.retrieveAccessToken(consumer, verifier);

Вот и все, теперь вы можете получать токен и секрет с помощью getToken() и getTokenSecret().

13
ответ дан 5 December 2019 в 12:54
поделиться

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

вот видео

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

0
ответ дан 5 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: