我想为我的移动应用程序实现一个无密码身份验证流程,该流程只需要用户单击其电子邮件中的链接即可登录。类似于 Slack 处理身份验证的方式。我将使用node
andjwt
来实现这个实现。
我想我已经想出了一个安全的设计,但我确定我错过了一些东西。我希望得到社区的一些批评。
开始了:
- 用户打开移动应用程序。
- 我们检查用户的本地存储中是否有令牌。
- 如果他们这样做,我们将该令牌添加到他们的标题中并发送到应用程序的主页。
- 否则,我们会提示他们输入电子邮件以开始使用
- 当他们单击“提交”时,我们将其发布
email address
到我们服务器上的requestMagicLink
端点。 - 服务器检查数据库中的用户
email address
- 如果我们找到使用该电子邮件的用户,我们会
id
从该用户那里获取 - 如果用户不存在,我们创建一个新用户,然后获取
id
- 我们使用 JWT 生成带有 的令牌
id
,并且我们的令牌在secret
之后过期1 hour
- 我们通过电子邮件中的链接将该令牌发送给用户。
- 单击后,该链接将使用查询参数向
magicLogin
端点的服务器发送 GET 请求token
- 我们使用 JWT 和我们的
secret
. - 如果验证失败,我们会将用户重定向到我们用电子邮件提示他们开始使用的屏幕。
- 如果成功,我们使用 their
id
和我们的secret
that生成一个新的 JWT 令牌doesn't have an expiration
,然后在 URL 的参数中将其传递回用户,将用户重定向到我们应用程序中的成功页面。 - 该应用程序从参数中获取令牌并将其存储在本地存储中,直到用户选择注销,并且用户被重定向到主页。
- 对 api 的请求现在都在标头中包含令牌,用户可以开始了。
编辑(添加额外的想法):我正在考虑使其更安全的事情:如果我们将令牌分成两部分,将一半发送到移动设备,另一半发送到电子邮件会怎样。这样,只有有权访问该电子邮件和访问该特定设备的用户才能进行身份验证。