我正在编写一个android应用程序,这是一个多人游戏的客户端。
我需要一种可靠的方式来验证用户,以便将用户与他们的游戏帐户连接起来,存储他们在游戏中的进度,并允许他们稍后重新登录并继续玩他们离开的地方。
一个简单的解决方案是实现基于密码的登录并"自己"管理密码(在我的应用程序和游戏服务器中)。然而,在移动设备上输入密码非常不方便。仔细研究这个话题,他们说最好的登录是没有密码提示的登录(通常尽可能少的用户交互)。
我希望在android应用程序中实现可靠的无密码登录的最佳方法是基于google帐户的登录。每个安卓设备都已经连接了一个谷歌账户,对吧?
在web和stackoverflow上搜索,我非常惊讶地发现我找不到关于我的问题的好的文档,我认为这是许多人在我之前一定遇到过的标准问题。
一些对我来说很有希望的事情:
- Google Sign-In Api
- 使用谷歌智能锁与谷歌帐户登录(这是否在任何方面比登录api更好?)
- 使用谷歌智能锁自动创建我自己的登录/密码凭证,并使用他们"幕后"
那么,实现方便的无需密码登录的最佳方法是什么?
我对"最佳"的定义是:
- 对用户最方便。尽可能少的交互。
- 合理安全,防止帐户被劫持。
取决于您需要如何识别您的用户。如果电子邮件地址是足够的,你可能正在寻找OpenID连接。你会得到一个签名的ID令牌,如果签名是正确的,你可以相信里面的信息,其中包括Gmail地址。谷歌有库可以简化这一操作,而Android设备已经有了令牌,所以用户不必输入密码。更多信息在这里:
https://developers.google.com/identity/protocols/oauth2/native-appGoogle Games登录可能更适合你,而Firebase可以让你更轻松地管理用户数据,而无需运行自己的服务器。
我的应用程序也有类似的问题,发现最好的解决方案是实现FIDO协议,该协议允许用户使用安全存储在移动设备中的私钥登录:
注册在线服务时,用户的客户端设备创建一个新的密钥对。它保留私钥并向在线服务注册公钥。身份验证由客户端设备完成,通过签名质疑来证明拥有服务的私钥。
为了更形象地理解它,这里有一个解释FIDO是如何工作的图表。
为什么这是最好的解决方案?
- 这是非常方便的,因为你的用户不需要做任何交互登录,只要从持有私钥的设备访问你的应用程序。你可以从应用程序默默地验证他们。如果用户从不同的手机访问应用程序,你可以发送推送通知,并在你的应用程序中显示一个批准登录请求的提示。这个方法是安全的,因为:
- 它避免了用户的错误密码。
- 私钥永远不会离开设备。这意味着您永远不需要在数据库中存储密码。
- 非对称加密确保只有持有私钥的设备才能进行有效的签名。
如何在Android中实现:
对于Android应用程序,实现这一点的最简单方法是使用Cotter,这是一种类似Firebase的认证服务,但侧重于无密码登录。您可以创建一个免费帐户来获取您的API密钥。
Documentation:这是关于在Android上实现上述FIDO协议的指南。
如果你想自己做,你可以查看Android密钥库系统