我有兴趣在移动应用程序和 API 之间构建某种无密码登录(假设我可以控制两者)。动机是必须登录对用户来说非常烦人并且存在安全风险(例如,用户将重复使用现有密码),我希望用户能够立即开始使用该应用程序。
我想知道是否有一些可行的技术。例如:
- 在移动设备上生成随机登录名/密码,并将密码存储在钥匙串(keychain)中。
- 使用此登录名/密码组合注册 API。这将返回一个 token 。
- token 用于后续调用
缺点是:
- 如果用户删除应用程序,登录名/密码可能会丢失(这可以通过使用 iCloud 存储登录名来缓解 - 但这对密码不利吗?)
- 密码存储在设备上(但它在钥匙串(keychain)中)
所以我的问题是:这样的事情是否可行且足够安全?有已知的技术可以做到这一点吗?
最佳答案
这是我们所做的:
基本上,这个想法与大多数服务提供的“忘记密码”非常相似:
- 向用户索取电子邮件
- 发送一封带有激活链接的电子邮件。该电子邮件包含带有一次性 token 的深层链接,类似于
myapp://login?token=.....
。 - 用户在安装应用程序的设备上打开电子邮件这对于深层链接的工作至关重要,但无论如何在 99% 的情况下都会发生这种情况。用户点击带有深层链接的按钮
- 用户被重定向回应用程序,您从应用程序的深层链接中提取 token 并将其发送到服务器 api 以进行身份验证。身份验证完成后,为用户创建一个 session ,这样他们就不需要再次进行身份验证
优点:
- 更安全:用户不必考虑新密码(通常是 too simple ),也不存在用户重复使用密码的风险。对于作为开发人员的我们来说,它提供了一种解决方案,该解决方案只有一个(而且简单!)身份验证路径,更易于理解并因此受到保护。此外,我们不必触及任何用户密码/散列密码。
- 更顺畅的用户入职流程:如果您在输入字段中预先输入电子邮件,登录流程可以短至点击 2 次按钮,然后他们就进入了。(除非您想要他们的姓名/其他详细信息,但在传统登录中也需要额外的输入字段)
不太好:)
- 用户可能不太习惯此流程,并且可能想知道为什么他们不需要密码。我会添加一个小链接来解释“为什么我们不需要密码?”
- 如果应用被删除或用户注销,他们将需要使用电子邮件重新登录。对于用户不会偶尔注销和登录等的移动应用程序来说,这不是什么问题
我已经在我们的应用程序中实现了这个流程,您可以在这里阅读更深入的解释: http://www.drzon.net/passwordless-login-in-mobile-apps/
更多注意事项:
- 为了提高安全性,请让 token 仅供使用一次,并为其设置有效期(例如一小时)。您还可以通过向服务器发送某种类型的唯一设备 ID 以及电子邮件地址,将 token 绑定(bind)到特定设备。这样用户就不能简单地将电子邮件转发给另一个人,而是他会打开它
- 关于深层链接 - 我发现一些电子邮件提供商会阻止使用带有自定义 url 方案的链接,例如
app://
。克服这个问题的方法是让链接指向您的服务器,然后重定向到实际的深层链接https://myserver.com/login?token=...
--->myapp://login?token=...
Mozilla 也写过它 here
关于android - 如何为移动应用创建无密码登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12575989/