我需要在 2 个或更多 Android 应用程序之间共享通用的持久登录(身份验证令牌)。诀窍在于,任何一个应用程序都不需要安装另一个应用程序即可工作。它们是相互独立的。
因此,在应用程序登录之前,它会问一个问题:“是否可能有另一个友好的应用程序可以为我提供(或已存储在某处)我可以使用的令牌?”
显然,我可以使用多种方法(和问题)来解决这个问题:
- 使用共享服务(需要二次安装,哪个应用程序安装它?)
- 使用共享内容提供程序(需要二次安装,哪个应用程序安装它?)
- 使用系统上的文件(如果该文件存在/可能无法在每个设备上访问)
- 使用共享首选项(我相信在某些 Android 版本上全局共享首选项是不可能的)
- 使用有序广播(唤醒另一个可能的应用程序并询问它)
stackoverflow 的人们认为什么是既简单又健壮的最佳方法?
您可以从编写帐户验证器开始。 Android 验证器开发的规范文本是http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/
我根据这篇文章为我的应用程序编写了一个身份验证器。但是,我没有尝试过让两个带有身份验证器的应用程序注册相同的帐户类型。我认为两个应用程序中都应该有验证器代码。当应用程序要求为您安装了两个应用程序的帐户类型提供身份验证器时,使用哪个身份验证器并不重要,因为它们都执行相同的操作。
您还可以将身份验证器放在单独的库中,但现在您拥有三个应用程序。
EDIT:
以下是我如何将身份验证器集成到我的应用程序中LoginActivity
:
- 检查上次登录用户名的首选项。
- 如果没有用户名,请致电
AccountManager.newChooseAccountIntent()
与我的身份验证器的帐户类型。
- 如果有用户名,请致电
AccountManager.getAccountsByType()
使用帐户类型,查看该用户名的帐户,然后致电accountManager.getPassword(account)
使用该用户的帐户。
- 现在我有了用户名和密码,所以我可以登录了。当用户成功登录后,可以将用户名存储在首选项中以供后续自动登录。
我的身份验证器活动有一个用于“将现有帐户添加到设备”的 UI 流程。在这种情况下,用户已经订阅了我们的服务。他们输入用户名和密码,如果他们在服务器上经过身份验证,则会将一个帐户添加到该用户名的设备中。
还有一个“注册新帐户”UI 流程,用户输入所有注册信息并创建 30 天免费试用帐户。在此过程中,用户已经通过身份验证,因为密码是在此过程中输入的。
这意味着,当用户从帐户选择器中选择“添加帐户”时,用户将通过身份验证,而选择现有帐户只会从设备中返回该帐户,而无需进行身份验证。该方法的缺点之一是AccountManager
Account Chooser 是没有办法在返回意图中放置一个标志来表示到底发生了什么,因此当帐户选择器活动完成时,您必须通过一些跳房子来查看是否发生了身份验证。我选择了一条安全且保守的路线,每次都进行身份验证,这意味着我在添加帐户时重复服务器身份验证。
您还必须考虑许多极端情况,例如:
- 如果用户的登录有效,但订阅已过期,这意味着需要发送到电子商务模块来续订服务,该怎么办
- 如果用户通过 Web 应用程序更改了服务器上的密码,因此现在密码与设备不同步,该怎么办?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)