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

时间:2018-06-01 08:56:11

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

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

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

  1. 首次登录时,用户名和密码将通过HTTPS
  2. 发送给服务器
  3. 如果凭据正确,服务器将生成具有以下过程的令牌:
    • 将用户名和密码哈希合并为字符串
    • 使用SHA和服务器密钥再次散列字符串
    • 替换字符串中的字符
    • 从字符串
    • 创建一个N-char字符串(标记)
  4. 然后将此令牌发送回设备,并将用户名和此令牌存储到LocalStorage
  5. 从现在开始,用户使用用户名和此令牌登录(自动或单击他要登录的帐户时)
  6. 这是否足够安全或我应该改进什么?我有点担心将用户名存储到LS中,但这是我向用户显示他登录的帐户时唯一的信息。

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

1 个答案:

答案 0 :(得分:1)

关于生成令牌的部分,您可以查看名为JWT的内容。如页面上所述,JWT是一种用于在双方之间安全地表示索赔的方法,这意味着您可以使用它来验证使用您的页面的用户实际上是他所声称的人。对于其他部分,您提出的是一个可靠的标准策略(用户登录,获取令牌,使用此令牌来使用该应用程序而无需再次登录)。

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

JWT由Header,Payload和Signature三部分组成。标头和有效负载是公共的(即,具有令牌的用户可以读取它们,它们仅是Base64编码的),因此不要在其中存储秘密数据(通过用户名和密码用盐哈希)没事的)。当您生成jwt时,服务器计算标头+有效负载+秘密的散列(仅对服务器知道的秘密)并将其放入签名中。然后,当用户尝试进行身份验证时,签名必须与数据匹配(因为服务器再次散列标头+有效负载+机密并将其与签名进行比较),然后服务器才接受该签名。这种方式在不知道秘密用户的情况下不能自己改变数据。 JWT还实施了开箱即用的#34;您可能感兴趣的另一项功能 - 到期时间。这样,如果用户在一段时间内未使用该页面,您可以自动注销用户。至于令人耳目一新的令牌,有几种方法,你需要以正确的方式为自己解雇,Link