【发布时间】:2018-06-01 08:56:11
【问题描述】:
我正在开发一个混合应用程序,用户可以在使用用户名和密码登录时单击“记住我”。如果用户只有 1 个“已存储”帐户,它会自动让他登录,但如果他有 1 个以上“已存储”帐户,应用程序会向他显示可用帐户列表(如登录 Gmail 时的帐户)。
为了实现上述行为,我想出了这个程序:
- 首次登录时,用户名和密码通过 HTTPS 发送到服务器
- 如果凭据正确,服务器会使用以下过程生成令牌:
- 将用户名和密码哈希合并成一个字符串
- 使用 SHA 和服务器密码再次对字符串进行哈希处理
- 替换字符串中的字符
- 从字符串创建一个 N-char 字符串(令牌)
- 然后将此令牌发送回设备,并将用户名和此令牌存储到 LocalStorage
- 从现在开始,用户使用用户名和此令牌登录(自动或单击他要登录的帐户时)
这足够安全还是我应该改进一些东西?虽然我有点担心将用户名存储到 LS 中,但这是我在向用户显示他正在登录的帐户时所拥有的唯一信息。
编辑:可以有多个不同的人(例如家庭成员)登录帐户,因为该应用控制着一个设备。
【问题讨论】:
-
我在看 JWT,但据我所知,JWT 生成的令牌完全独立于用户名或密码(这是合乎逻辑的)。我不打算将令牌存储到数据库中,因为我可以每次都重新创建它,而且我还可以检测用户名或密码是否以这种方式更改。
-
我认为在使用 JWT 时,您必须将服务器生成的令牌存储到数据库中,以便当您从客户端收到令牌时,它可以比较它们。我想我错了。谢谢,我会看看它并尝试构建一个演示。
-
感谢您提供详细信息以及有关标头和数据的提示。
-
我做了一个 JWT 演示,大致了解了它的工作原理。我的想法是,当用户单击“记住我”并首次登录时,令牌将永远留在 LS 中(除非用户从他的设备中删除该帐户)。据我所知,JWT 有过期时间,所以我想知道如果您处于会话中间并且令牌过期,您将如何处理?只是寄回一个新的?另外我想知道在使用 JWT 时如何检测到用户名或密码已更改?你不会把它们放在有效载荷中,是吗?
-
我用答案替换了 cmets,因为它们变得越来越笨重了。
标签: javascript authentication local-storage token hybrid-mobile-app