8

我有兴趣在移动应用程序和 API 之间构建某种无密码登录(假设我可以同时控制两者)。动机是必须登录对用户来说非常烦人并且存在安全风险(例如,用户将重复使用现有密码),我希望用户能够立即开始使用该应用程序。

我想知道是否有一些可行的技术。例如:

  1. 在移动设备上生成和随机登录/密码,并将密码存储在钥匙串中。
  2. 使用此登录名/密码组合注册 API。这将返回一个令牌。
  3. 令牌用于后续调用

缺点是:

  • 如果用户删除应用程序,登录名/密码可能会丢失(这可以通过使用 iCloud 存储登录名来缓解 - 但这对密码不利?)
  • 密码存储在设备上(但它在钥匙串中)

所以我的问题是:这样的事情是否可行且足够安全?是否有已知的技术可以做到这一点?

4

2 回答 2

8

这是我们所做的:

基本上,这个想法与大多数服务提供的“忘记密码”非常相似:

  1. 向用户询问电子邮件
  2. 发送带有激活链接的电子邮件。该电子邮件包含一个带有一次性令牌的深层链接,例如myapp://login?token=......
  3. 用户在安装了应用程序的设备上打开电子邮件,这对于深层链接的工作至关重要,但无论如何在 99% 的情况下都会发生这种情况。用户点击带有深层链接的按钮
  4. 用户被重定向回应用程序,您从应用程序的深层链接中提取令牌并将其发送到服务器 api 以进行身份​​验证。身份验证完成后,为用户创建一个会话,这样他们就不需要再次进行身份验证

好的:

  1. 更安全:用户不必考虑新密码(通常过于简单),也不存在用户重复使用密码的风险。对于作为开发人员的我们来说,它提供了一种解决方案,该解决方案只有一个(而且很简单!)身份验证路径,更易于理解并因此更易于保护。此外,我们不必触摸任何用户密码/散列密码。
  2. 为用户提供更流畅的入职流程:如果您在输入字段中预先输入电子邮件,则登录流程可以短至单击 2 次按钮并且他们就在其中。(除非您还想获取他们的姓名/其他详细信息,但这需要传统登录中的附加输入字段)

不太好:)

  1. 用户可能不太习惯这种流程,并且可能想知道为什么他们不需要密码。我会添加一个小链接,解释“为什么我们不需要密码?”
  2. 如果应用程序被删除或用户注销,他们将需要使用他们的电子邮件重新登录。对于用户不偶尔注销和登录等的移动应用程序来说,这不是问题

我已经在我们的应用程序中实现了这个流程,你可以在这里阅读更深入的解释: http ://www.drzon.net/passwordless-login-in-mobile-apps/

还有一些注意事项:

  • 为了使其更安全,请使令牌仅可使用一次,并为其设置过期时间(例如一小时)。您还可以通过向服务器发送某种类型的唯一设备 ID 以及电子邮件地址,将令牌绑定到特定设备。这样用户就不能简单地将电子邮件转发给另一个人,而是将其打开
  • 关于深层链接 - 我发现一些电子邮件提供商阻止使用带有自定义 url 方案的链接,例如app://. 克服这个问题的方法是将链接指向您的服务器,然后将其重定向到实际的深层链接 https://myserver.com/login?token=...--->myapp://login?token=...

Mozilla在这里也写过

于 2014-10-31T16:07:14.740 回答
2

这是非常开放的,但通常:不要重新发明轮子,使用标准解决方案,例如 OAuth 和/或 OpenID Connect(使用 OAuth)。这样做的缺点是用户可能需要通过 WebView 或类似方式登录才能获取令牌,但您不必存储密码。

需要考虑的事项:

  • 您不能真正生成随机密码,因为服务器也需要知道它
  • Android 没有类似公共钥匙串的 API,因此您必须自己保护密码。

至于“足够安全”,现在几乎每个人都使用 OAuth(Twitter、Facebook 等),所以它至少得到了证明。实际的安全性将取决于您的特定实现。

于 2012-09-25T04:07:00.103 回答