如何为移动应用程序创build无密码login

我在构build移动应用程序和API之间build立某种无密码login(假设我可以控制两者)进行构build。 其动机是,必须login非常恼人的用户和安全风险(例如,用户将重用现有的密码),我希望用户能够立即开始使用该应用程序。

我想知道是否有一些技术可以工作。 例如:

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

缺点是:

  • 如果用户删除了应用程序,login/密码可能会丢失(这可以通过使用iCloud来存储login信息来缓解 – 但这对密码不好)?
  • 密码存储在设备上(但是它在钥匙串中)

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

以下是我们所做的:

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

  1. 询问用户的电子邮件
  2. 发送带有激活链接的电子邮件。 该电子邮件包含一个一次性令牌的深层链接,如myapp://login?token=.....
  3. 用户在安装应用程序的设备上打开电子邮件这对深层链接起作用是至关重要的,但是99%的情况发生了什么。 用户点击深层链接的button
  4. 用户被redirect回应用程序,您从应用程序的深层链接中提取令牌,并将其发送到服务器api进行身份validation。 authentication完成后,为用户创build一个会话,以便他们不需要再次进行authentication

好:

  1. 更安全:用户不必考虑新的密码(通常太简单 ),并且不存在用户重复使用密码的风险。 对于我们作为开发者来说,它提供了一个解决scheme,它只有一个(而且很简单)的authenticationpath,这个authenticationpath更易于理解,因此可以进行保护。 另外,我们不必触摸任何用户密码/散列密码。
  2. 更stream畅地向用户提供入门stream程:如果您在input字段中预先input了电子邮件,loginstream程可以短至2个button,并且它们已经进入。(除非您想获取其名称/其他详细信息,但这需要传统login中的其他input字段也是如此)

不太好:)

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

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

更多的考虑:

  • 为了使它更安全,使令牌可用,只使用一次,并放在它过期(如一个小时)。 您还可以通过向服务器发送某种types的唯一设备ID以及电子邮件地址,将令牌绑定到特定设备。 这样,用户不能简单地将电子邮件转发给另一个人,而是将其打开
  • 关于深层链接 – 我发现有些电子邮件提供商阻止使用自定义urlscheme(如app://的链接。 解决这个问题的方法是将链接指向您的服务器,并将其redirect到实际的深层链接https://myserver.com/login?token=... —> myapp://login?token=...

Mozilla 在这里也写了这个

这是非常开放的,但通常:不要重新发明轮子,使用OAuth和/或OpenID Connect(使用OAuth)等标准解决scheme。 这有缺点,用户可能需要通过WebView或类似的login来获得一个令牌,但是你不需要存储密码。

需要考虑的事项:

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

至于“足够安全”,现在几乎每个人都使用OAuth(Twitter,Facebook等),所以至less已经certificate了这一点。 实际的安全将取决于您的具体实施。