如何为移动应用程序创build无密码login
我在构build移动应用程序和API之间build立某种无密码login(假设我可以控制两者)进行构build。 其动机是,必须login非常恼人的用户和安全风险(例如,用户将重用现有的密码),我希望用户能够立即开始使用该应用程序。
我想知道是否有一些技术可以工作。 例如:
- 在移动设备上生成并随机login/密码并将密码存储在钥匙串中。
- 使用此login名/密码组合注册API。 这将返回一个令牌。
- 令牌用于随后的调用
缺点是:
- 如果用户删除了应用程序,login/密码可能会丢失(这可以通过使用iCloud来存储login信息来缓解 – 但这对密码不好)?
- 密码存储在设备上(但是它在钥匙串中)
所以我的问题:这样的事情是否可行和安全? 有没有已知的技术来做到这一点?
以下是我们所做的:
基本上,这个想法与大多数服务提供的“忘记密码”非常相似:
- 询问用户的电子邮件
- 发送带有激活链接的电子邮件。 该电子邮件包含一个一次性令牌的深层链接,如
myapp://login?token=.....
- 用户在安装应用程序的设备上打开电子邮件,这对深层链接起作用是至关重要的,但是99%的情况发生了什么。 用户点击深层链接的button
- 用户被redirect回应用程序,您从应用程序的深层链接中提取令牌,并将其发送到服务器api进行身份validation。 authentication完成后,为用户创build一个会话,以便他们不需要再次进行authentication
好:
- 更安全:用户不必考虑新的密码(通常太简单 ),并且不存在用户重复使用密码的风险。 对于我们作为开发者来说,它提供了一个解决scheme,它只有一个(而且很简单)的authenticationpath,这个authenticationpath更易于理解,因此可以进行保护。 另外,我们不必触摸任何用户密码/散列密码。
- 更stream畅地向用户提供入门stream程:如果您在input字段中预先input了电子邮件,loginstream程可以短至2个button,并且它们已经进入。(除非您想获取其名称/其他详细信息,但这需要传统login中的其他input字段也是如此)
不太好:)
- 用户可能不习惯这个stream程,可能会问他们为什么不需要密码。 我会添加一个小链接,解释“为什么我们不需要密码?”
- 如果应用程序被删除或用户注销,他们将需要使用他们的电子邮件重新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了这一点。 实际的安全将取决于您的具体实施。
- 何时在应用程序中调用completionHandler:performFetchWithCompletionHandler:当背景获取是asynchronous?
- 使用jQuery Mobile创buildiOS页面指示器(点)