Android 如何为移动应用程序创建无密码登录

Android 如何为移动应用程序创建无密码登录,android,ios,security,token,password-protection,Android,Ios,Security,Token,Password Protection,我擅长在移动应用程序和API之间构建某种无密码登录(假设我可以控制两者)。其动机是,必须登录对用户来说非常烦人,并且存在安全风险(例如,用户将重用现有密码),我希望用户能够立即开始使用该应用程序 我想知道是否有一些技术可以奏效。例如: 在移动设备上生成和随机登录/密码,并将密码存储在钥匙链中 使用此登录/密码组合注册API。这将返回一个令牌 令牌用于后续调用 缺点是: 如果用户删除应用程序,登录名/密码可能会丢失(这可能会通过使用iCloud存储登录名来缓解,但这对密码不好?) 密码存储在设备

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

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

  • 在移动设备上生成和随机登录/密码,并将密码存储在钥匙链中
  • 使用此登录/密码组合注册API。这将返回一个令牌
  • 令牌用于后续调用
  • 缺点是:

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

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

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

    需要考虑的事项:

    • 您不能真正生成随机密码,因为服务器也需要知道它
    • Android没有像API一样的公钥链,所以你必须自己保护密码
    至于“足够安全”,现在几乎每个人都在使用OAuth(Twitter、Facebook等),所以它至少是经过验证的。实际的安全性将取决于您的具体实现。

    以下是我们所做的:

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

  • 向用户索要电子邮件
  • 发送带有激活链接的电子邮件。该电子邮件包含一个带有一次性标记的deeplink,类似于
    myapp://login?token=.....
  • 用户在安装应用程序的设备上打开电子邮件,这对于深度链接的工作至关重要,但不管怎样,99%的情况下都会发生这种情况。用户使用deeplink单击按钮
  • 用户被重定向回应用程序,您从应用程序上的deeplink提取令牌并将其发送到服务器api进行身份验证。身份验证完成后,为用户创建一个会话,这样他们就不需要再次进行身份验证
  • 好的:

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

  • 用户可能不太习惯这个流程,可能想知道为什么他们不需要密码。我会添加一个小链接,解释“为什么我们不需要密码?”
  • 如果应用被删除或用户注销,他们将需要使用电子邮件再次登录。这对于移动应用来说不是什么问题,因为用户不会偶尔注销或登录等
  • 我已经在我们的应用程序中实现了此流程,您可以在此处阅读更深入的说明:

    更多注意事项:

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