成功登录后,如何在localstorage或cookie中保存除JWT之外的任何其他用户信息的良好做法? (用户配置文件对象已经在jwt有效负载子部分中保存和加密。)我需要准备好用户配置文件对象,然后再初始化其他任何角度(用于获取用户角色,登录状态等)。
如果我在客户端只保存JWT,那么在app加载之前我需要一个额外的ajax请求来从服务器端的JWT解码获取用户信息,因为令牌秘密在服务器上(仅在整页刷新之后)。令牌有效或无效,因此在这种情况下处理错误要容易得多。
如果我将JWT和用户个人资料对象保存为客户端存储中的字符串,那么这将是一个冗余,用户可以手动更改该对象和应用程序可能会关闭。
我更喜欢在成功登录后仅在客户端保存JWT存储,但我需要一些建议,在这种情况下如何组织代码?完整页面刷新后如何获取用户配置文件对象?
请帮忙。
答案 0 :(得分:2)
最安全的解决方案是将JWT存储在仅HTTPS的cookie中,然后请求服务器获取用户对象。
如果您想避免对服务器的额外呼叫,您需要获得创意。我尝试的一种方法是将JWT的索赔主体存储在客户端 - 只是正文,签名被排除在外。签名被排除了"令牌"不再是JWT,也不能用于身份验证,从而防止实际访问令牌被盗出本地存储。
然而,这可以假设关于索赔机构的两件事:
1)该信息不透明且不包含有关用户的个人身份信息(PII)(本地存储容易受到XSS攻击)。
2)如果在本地存储中修改了此对象,则Angular应用程序不会向用户泄漏敏感信息(您不应将敏感信息存储在Angular应用程序中,它应受API保护)
3)与所有基于cookie的身份验证策略一样,您可以保护自己免受CSRF Attacks
的攻击我在Stormpath工作,最近我写了一篇关于这个主题的博文:Token Based Authentication for Single Page Apps。
希望这有帮助!
答案 1 :(得分:0)
为了简单起见,我只存储JWT并实现额外的ajax调用以获取用户配置文件。
但是如果你绝对想避免这一次调用,你可以考虑使用非对称签名的JWT而不是加密的JWT,然后在客户端提取数据,假设你控制了JWT的创建。