android - Android 中的 OAuth 实例状态

标签 android oauth

我正在尝试在 Android 应用程序中使用 OAuth。我让它正常工作,但有时在身份验证阶段遇到问题。在 Android 中,我启动浏览器供用户登录和验证。然后回调 url 将重定向回我的应用程序。

问题来了。我的应用程序有一个 OAuth 消费者和提供者作为我的主类的成员。当启动浏览器进行身份验证时,有时我的主要 Activity 会被丢弃以节省内存。当回调 url 重新启动我的主要 Activity 时,提供者和消费者是新实例,因此当我尝试向 api 发出请求时不起作用。如果在身份验证阶段未释放主 Activiy,则一切正常,因为我仍在与原始消费者和提供者合作。

我尝试使用 onSaveInstanceState() 和 onRestoreInstanceState(),但没有成功。处理我的回调 URL 时,似乎没有调用 onRestoreInstanceState()。似乎直接进入 onResume()。

在这种情况下,持久化消费者和提供者的正确方法是什么?

最佳答案

完整的保存/恢复解决方案

除了 request_tokentoken_secret 之外,isOauth10a() 状态对于在提供程序中恢复很重要。将来可能会有更多的状态信息。因此,我最喜欢持久化和加载解决方案。

我扩展了 GrkEngineer 的解决方案以使其更加完整。它保存/恢复提供者和消费者,处理所有异常,并在恢复时设置 httpClient。

protected void loadProviderConsumer()
{
  try {
    FileInputStream fin = this.openFileInput("tmp_provider.dat");
    ObjectInputStream ois = new ObjectInputStream(fin);
    provider = (CommonsHttpOAuthProvider) ois.readObject();
    provider.setHttpClient(httpClient);
    ois.close();
    fin.close();

    fin = this.openFileInput("tmp_consumer.dat");
    ois = new ObjectInputStream(fin);
    consumer = (CommonsHttpOAuthConsumer) ois.readObject();
    ois.close();
    fin.close();

    Log.d("OAuthTwitter", "Loaded state");
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (StreamCorruptedException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  } catch (ClassNotFoundException e) {
    e.printStackTrace();
  }
}

protected void persistProviderConsumer()
{

  try {
    FileOutputStream fout = this.openFileOutput("tmp_provider.dat", MODE_PRIVATE);
    ObjectOutputStream oos = new ObjectOutputStream(fout);
    oos.writeObject(provider);
    oos.close();
    fout.close();

    fout = this.openFileOutput("tmp_consumer.dat", MODE_PRIVATE);
    oos = new ObjectOutputStream(fout);
    oos.writeObject(consumer);
    oos.close();
    fout.close();

    Log.d("OAuthTwitter", "Saved state");
  } catch (FileNotFoundException e) {
    e.printStackTrace();
  } catch (IOException e) {
    e.printStackTrace();
  }
}

我已经测试了这段代码并且它有效。

关于android - Android 中的 OAuth 实例状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1965568/

相关文章:

android - 在android上将字符串转换为电子邮件附件

java - 在不忽略 SSL 错误的情况下,Android Web View 中握手失败的 SSL 错误的最佳解决方案

ssl - 有人让 Twitter xAuth 使用 Compact Framework 了吗?

api - 如何直接从我的服务器将视频上传到 Youtube?

java - 在 Web 应用程序中实现身份验证

安卓应用找不到文件

android - meteor raix :push notification channelId for android 8. 0.0

java - 如何在 if 语句之外获取变量的值

python - 如何在 Python Flask 中访问 # 之后的 URL 段?

oauth - 通过身份验证创建 gitlab oauth token