在Android应用程序之间共享身份验证令牌

Rob*_*ely 6 android

我需要在 2 个或多个 android 应用程序之间共享一个通用的永久登录(身份验证令牌)。诀窍是不需要安装任何一个应用程序即可让另一个应用程序工作。它们彼此独立。

因此,在应用程序登录之前,它会询问“是否可能有另一个友好的应用程序可以给我(或已存储在某处)一个我可以使用的令牌?”

显然,我可以使用多种方法(和问题)来解决这个问题:

  • 使用共享服务(需要二次安装,哪个应用安装?)
  • 使用共享内容提供程序(需要二次安装,哪个应用程序安装它?)
  • 使用系统上的文件(如果文件存在/可能无法在每个设备上访问)
  • 使用共享首选项(我相信在某些 android 版本上,全局共享首选项是不可能的)
  • 使用有序广播(唤醒另一个可能的应用程序并询问它)

stackoverflow 的人认为什么是简单但又健壮的最佳方法?

kri*_*son 5

您可以从编写帐户验证器开始。Android 身份验证器开发的规范文本是http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/

我根据这篇文章为我的应用程序编写了一个身份验证器。但是,我还没有尝试过使用两个带有身份验证器的应用程序注册相同的帐户类型。我认为应该可以在两个应用程序中都有身份验证器代码。当应用程序要求为您安装了这两个应用程序的帐户类型提供身份验证器时,它使用哪个身份验证器并不重要,因为它们都做同样的事情。

您也可以在单独的库中使用身份验证器,但现在您拥有三个应用程序。


编辑:

以下是我将身份验证器集成到我的应用程序中的方式LoginActivity

  1. 检查上次登录用户名的首选项。
  2. 如果没有用户名,请AccountManager.newChooseAccountIntent()使用我的身份验证器的帐户类型调用。
  3. 如果有用户名,请AccountManager.getAccountsByType()使用帐户类型调用,查看该用户名的帐户,然后accountManager.getPassword(account)使用该用户的帐户调用。
  4. 现在我有了用户名和密码,所以我可以登录了。当用户成功登录后,用户名可以存储在首选项中,以便后续自动登录。

我的身份验证器活动有一个用于“将现有帐户添加到设备”的 UI 流。在这种情况下,用户已经订阅了我们的服务。他们输入用户名和密码,如果他们在服务器上通过了身份验证,则会为该用户名在设备中添加一个帐户。

还有一个“注册新帐户”UI 流程,用户可以在其中输入所有注册信息并创建一个 30 天免费试用帐户。在此过程中,用户已通过身份验证,因为在此过程中输入了密码。

这意味着当用户从帐户选择器中选择添加帐户时,用户已通过身份验证,而选择现有帐户只会从设备中返回该帐户,而无需进行身份验证。AccountManager帐户选择器的缺点之一是无法在返回意图中放置一个标志来说明实际发生的情况,因此当帐户选择器活动完成时,您必须通过一些跳房子来查看是否发生了身份验证或不是。我选择了一条安全而保守的路线,每次只进行身份验证,这意味着我在添加帐户时复制服务器身份验证。

您还必须考虑许多极端情况,例如:

  • 如果用户的登录是有效的,但是他们的订阅已经过期,这意味着他们需要被发送到电子商务模块来更新他们的服务怎么办
  • 如果用户从 Web 应用程序更改了服务器上的密码,那么现在密码与设备不同步怎么办。