【问题标题】:What is the best way to implement OAuth on Android?在 Android 上实现 OAuth 的最佳方式是什么?
【发布时间】:2021-08-02 07:55:17
【问题描述】:

我不是新手,但我主要是一名 iOS 开发人员,多年来没有在 Android 上工作过。不幸的是,我现在需要在现有的用 Kotlin 编写的 Android 应用中实现 OAuth 登录。

我了解 OAuth 的基础知识,并且最近在 iOS 应用中实现了它。

我决定将打开 OAuth 登录页面的代码直接放入 Android 应用程序主要活动的 onCreate() 方法中。这有效,因为当应用程序运行时,网页打开。另外,我设置了一个意图过滤器来响应来自 OAuth 网站的重定向(它也是一个附加到主要活动的意图)。

当我运行应用程序时,我可以登录,再次调用onCreate()方法,我可以从intent.data中得到我需要的结果。但是,当我尝试导航到代表应用程序主屏幕的片段时,应用程序随后崩溃。日志中的错误是“java.lang.IllegalStateException:FragmentManager 已被销毁”。

我知道主屏幕片段可以正常工作,如果我不进行 OAuth 直接打开它就会出现。

我怀疑我通过让重定向转到主要活动来做一些非法的事情,而且,当登录完成时,我需要一段数据(我生成的“codeVerifier”字符串)。我可以让重定向打开一个新活动,但我不知道如何将该字符串传达给它——我尝试使用静态变量,但 Kotlin 显然不支持静态。

构建这个的最佳方式是什么?

谢谢。

【问题讨论】:

  • 请让问题更简洁。
  • 能否请您显示重定向到主要活动的代码。 onCreate 和清单文件代码

标签: android kotlin oauth


【解决方案1】:

这看起来不是一个好的设计,但你重新制作它可能为时已晚。我会将所有 OAuth 流放入一个单独的 Activity(假设为 OAuthActivity),在 Manifest 中,我会将该 Activity 的 noHistory 设置为 true,因此用户在它消失后将无法返回它。在我的MainActivity(代表您的主屏幕)中,我会将launchMode 设置为singleTask,这样我就可以从OAuthActivity 调用它,而无需创建它的双重副本并传递OAuth 回调(我不知道那里会有什么数据,一些 JWT?)通过一些 Intent (另一种选择是通过 registerForActivityResult 启动 OAuthActivity 并通过回调返回数据更好)。

尽管如此,我不喜欢这种设计,但它应该可以工作。

Kotlin 确实支持静态变量(请阅读文档),您可以为此创建一个伴随对象:

class A {
    companion object {
        var someVar: String = ""
    }
}

但强烈建议不要使用任何持久的可变静态变量,除非它们是 privateconst(不可变)。

【讨论】:

    猜你喜欢
    • 2016-01-19
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多