Экземпляр OAuth указывает в Android

Я пытаюсь использовать OAuth в приложении для Android. Я имею его работающий правильно, но иногда сталкивался с проблемой в течение этапа аутентификации. В Android я запускаю браузер для пользователя, чтобы войти в систему и аутентифицировать. Тогда URL обратного вызова перенаправит назад к моему приложению.

Вот проблема. Мое приложение имеет потребителя OAuth и поставщика как члены моего основного класса. Когда браузер запускается для аутентификации, иногда мой основной вид деятельности отбрасывается для сохранения памяти. Когда URL обратного вызова повторно запускает мой основной вид деятельности, поставщик и потребитель являются новыми экземплярами и для этого не работают, когда я пытаюсь выполнить запрос к API. Если основной Activiy не был освобожден в течение этапа аутентификации, то все работает правильно, потому что я все еще работаю с исходным потребителем и поставщиком.

Я пытался использовать onSaveInstanceState () и onRestoreInstanceState (), но не был успешен. Кажется, что onRestoreInstanceState () не называют, когда мой URL обратного вызова обрабатывается. Кажется, переходит прямо к onResume ().

Каков корректный метод для сохранения потребителя и поставщика в этом случае?

9
задан GrkEngineer 27 December 2009 в 09:19
поделиться

4 ответа

Я решил эту проблему, сохранив объект провайдера в файле. Я использую библиотеку знаков и провайдер, и потребитель сериализуются.

protected void loadProvider()
{
    FileInputStream fin = this.openFileInput("provider.dat");
    ObjectInputStream ois = new ObjectInputStream(fin);
    this.provider = (DefaultOAuthProvider) ois.readObject();
    ois.close();
    consumer = this.provider.getConsumer(); 
}

protected void persistProvider()
{
    FileOutputStream fout = this.openFileOutput("provider.dat", MODE_PRIVATE);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(this.provider);
    oos.close();
}

Я вызываю провайдера keep непосредственно перед запуском просмотра браузера с целью аутентификации, и восстанавливаю провайдера в onResume() непосредственно перед вызовом провайдера.getrieveAccessToken(). Если вы вызываете persistProvider() и loadProvider() еще в нескольких местах, вы также можете сохранить соответствующие токены после аутентификации. Это устранит необходимость повторной аутентификации (пока маркер действителен).

Я все еще хотел бы знать, какие поля в классе провайдера на самом деле необходимы для сохранения. Может быть, это немного замедляет сериализацию всего объекта.

3
ответ дан 4 December 2019 в 14:28
поделиться

Вы можете прочитать мой старый пост здесь . Обычно я использовал статическую ссылку и использовал активность с WebView вместо автономного браузера для отображения формы аутентификации

.
3
ответ дан 4 December 2019 в 14:28
поделиться

Вам нужно только сохранить consumer.getToken () и consumer.getTokenSecret ()

Позже вы можете просто воссоздать нового потребителя. (customerKey, customerKeySecret) и consumer.setTokenWithSecret (token, tokenSecret)

Сложно было выяснить следующее:

  1. Используйте CommonsHttpOAuthConsumer и CommonsHttpOAuthProvider (на Android) для DefaultOAuthProvider не будет работать.

  2. При использовании HttpURLConnection нельзя подписывать запросы POST , которые несут параметры запроса в полезных данных сообщения

2
ответ дан 4 December 2019 в 14:28
поделиться

У меня была такая же проблема. Все, что вам нужно для сохранения, это requestToken и tokenSecret, которые вы получаете после вызова retrieveRequestToken. В методе onResume() заново создайте объект потребителя и поставщика, как описано здесь. Таким образом, вам не нужно будет сохранять объекты consumer и provider целиком, и вы все равно сможете получить accessToken.

1
ответ дан 4 December 2019 в 14:28
поделиться
Другие вопросы по тегам:

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