【问题标题】:JS hybrid app - storing token in localStorageJS 混合应用程序 - 在 localStorage 中存储令牌
【发布时间】:2018-06-01 08:56:11
【问题描述】:

我正在开发一个混合应用程序,用户可以在使用用户名和密码登录时单击“记住我”。如果用户只有 1 个“已存储”帐户,它会自动让他登录,但如果他有 1 个以上“已存储”帐户,应用程序会向他显示可用帐户列表(如登录 Gmail 时的帐户)。

为了实现上述行为,我想出了这个程序:

  1. 首次登录时,用户名和密码通过 HTTPS 发送到服务器
  2. 如果凭据正确,服务器会使用以下过程生成令牌:
    • 将用户名和密码哈希合并成一个字符串
    • 使用 SHA 和服务器密码再次对字符串进行哈希处理
    • 替换字符串中的字符
    • 从字符串创建一个 N-char 字符串(令牌)
  3. 然后将此令牌发送回设备,并将用户名和此令牌存储到 LocalStorage
  4. 从现在开始,用户使用用户名和此令牌登录(自动或单击他要登录的帐户时)

这足够安全还是我应该改进一些东西?虽然我有点担心将用户名存储到 LS 中,但这是我在向用户显示他正在登录的帐户时所拥有的唯一信息。

编辑:可以有多个不同的人(例如家庭成员)登录帐户,因为该应用控制着一个设备。

【问题讨论】:

  • 我在看 JWT,但据我所知,JWT 生成的令牌完全独立于用户名或密码(这是合乎逻辑的)。我不打算将令牌存储到数据库中,因为我可以每次都重新创建它,而且我还可以检测用户名或密码是否以这种方式更改。
  • 我认为在使用 JWT 时,您必须将服务器生成的令牌存储到数据库中,以便当您从客户端收到令牌时,它可以比较它们。我想我错了。谢谢,我会看看它并尝试构建一个演示。
  • 感谢您提供详细信息以及有关标头和数据的提示。
  • 我做了一个 JWT 演示,大致了解了它的工作原理。我的想法是,当用户单击“记住我”并首次登录时,令牌将永远留在 LS 中(除非用户从他的设备中删除该帐户)。据我所知,JWT 有过期时间,所以我想知道如果您处于会话中间并且令牌过期,您将如何处理?只是寄回一个新的?另外我想知道在使用 JWT 时如何检测到用户名或密码已更改?你不会把它们放在有效载荷中,是吗?
  • 我用答案替换了 cmets,因为它们变得越来越笨重了。

标签: javascript authentication local-storage token hybrid-mobile-app


【解决方案1】:

关于生成令牌的部分,您可以查看名为 JWT 的内容。正如页面上所说,JWT 是一种“在两方之间安全地表示声明的方法”,这意味着您可以使用它来验证使用您页面的用户是否确实是他所说的那个人。对于其他部分,您想出的是一个非常标准的策略(用户登录,获取令牌,使用此令牌使用应用程序而无需再次登录)。

关于 JWT 的简单解释,因为您有很多问题:

JWT 由 Header、Payload 和 Signature 三部分组成。 Header 和 Payload 是公开的(即拥有令牌的用户可以读取它们,它们只是 Base64 编码的),所以不要在其中存储秘密数据(通过用户名和密码用盐散列应该没问题)。当您生成 jwt 时,服务器会计算 header+payload+secret(只有服务器知道的秘密)的哈希并将其放入签名中。然后当用户尝试验证签名必须与数据匹配(因为服务器再次散列 header+payload+secret 并将其与签名进行比较),然后才被服务器接受。这种方式在不知道秘密用户的情况下不能自己更改数据。 JWT 还实现了“开箱即用”的一项您可能感兴趣的附加功能 - 到期时间。这样,如果用户在特定时间段内未使用该页面,您可以自动注销用户。至于刷新代币有几种方法,你需要自己决定什么是适合你的方法,Link

【讨论】:

  • 非常感谢您的详细解释。我将检查有关到期时间的可能性。还要感谢用户名/密码更改检测可能的解决方案。 :)
猜你喜欢
  • 2021-11-15
  • 2020-02-14
  • 2018-11-24
  • 2019-07-04
  • 2012-06-04
  • 2016-08-12
  • 1970-01-01
  • 2018-11-26
  • 2019-11-02
相关资源
最近更新 更多