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

时间:2015-08-07 15:19:54

标签: android

我要求在2个或更多Android应用之间共享一个共同的presistent登录(auth令牌)。诀窍是任何一个应用程序都不需要安装,以便其他应用程序工作。它们彼此独立。

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

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

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

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

1 个答案:

答案 0 :(得分:3)

您可以从编写帐户身份验证器开始。 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. 现在我有用户名和密码,所以我可以登录。用户成功登录后,用户名可以存储在首选项中,以便后续自动登录。
  5. 我的身份验证器活动有一个用于"将现有帐户添加到设备"的UI流程。在这种情况下,用户已经订阅了我们的服务。他们输入用户名和密码,如果他们在服务器上进行了身份验证,则会在该设备上为该用户名添加一个帐户。

    还有一个"注册新帐户" UI流程,用户输入所有注册信息并创建30天免费试用帐户。在此过程中,用户已经过身份验证,因为密码是作为此过程的一部分输入的。

    这意味着当用户从“帐户选择器”中选择“添加帐户”时,将对用户进行身份验证,而选择现有帐户时,只需从设备返回帐户而不进行身份验证。 AccountManager帐户选择器的一个缺点是,无法在返回意图中添加标记来说明实际发生的事情,因此当帐户选择器活动完成时,您有通过一些跳房子来查看是否发生了身份验证。我选择了一个安全的&通过每次只进行身份验证来保守路由,这意味着我在添加帐户时复制了服务器身份验证。

    您还需要考虑一些极端案例,例如:

    • 如果用户的登录有效,但他们的订阅已过期,这意味着需要将其发送到电子商务模块以续订服务,该怎么办
    • 如果用户从网络应用更改了服务器上的密码,那么现在密码与设备不同步。