JS 混合应用程序 - 在 localStorage 中存储令牌

JS hybrid app - storing token in localStorage

我正在开发一个混合应用程序,用户可以在使用用户名和密码登录时单击 "remember me"。如果用户只有 1 个 "stored" 帐户,它会自动让他登录,但如果他有超过 1 个 "stored" 帐户,应用程序会向他显示可用帐户的列表(就像登录时的那个) Gmail).

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

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

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

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

关于生成令牌的部分,您可以查看名为 JWT 的内容。正如页面上所述,JWT 是一个 "method for representing claims securely between two parties",这意味着您可以使用它来验证使用您页面的用户是否确实是他所说的人。对于其他部分,您提出的是一个非常标准的策略(用户登录,获取令牌,使用此令牌使用该应用程序而无需再次登录)。

大家问题多,简单介绍下JWT:

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