JS 混合应用 - 将令牌存储在本地存储中



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

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

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

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

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

对于生成令牌的部分,您可以查看称为 JWT 的内容。正如页面上所说,JWT 是一种"在双方之间安全地表示声明的方法",这意味着您可以使用它来验证使用您页面的用户实际上是他所说的人。对于其他部分,你想出的是一个很好的标准策略(用户登录、获取令牌、使用此令牌使用应用,而无需再次登录(。

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

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

最新更新