登录后的角度JWT和用户信息存储

Angular JWT and user info storage after login

本文关键字:用户 信息 存储 JWT 登录      更新时间:2023-09-26

成功登录后,将除 JWT 以外的任何其他用户信息保存在本地存储或 cookie 中有多好的做法?(用户配置文件对象已在 jwt 有效负载子部分中保存和加密。我需要在初始化角度中的其他任何内容(用于获取用户角色、登录状态等)之前准备好用户配置文件对象。

如果我只在客户端保存 JWT,我需要在应用程序加载之前一个额外的 ajax 请求才能从服务器端的 JWT 解码中获取用户信息,因为令牌机密在服务器上(仅在整页刷新后)。令牌是有效的还是无效的,因此在这种情况下处理错误要容易得多。

如果我将 JWT 和用户配置文件对象保存为客户端存储中的字符串,那么这是多余的,用户可以手动更改该对象和应用程序可以关闭。

我更喜欢在成功登录后只将 JWT 保存在客户端的存储中,但我需要一些建议,在这种情况下如何组织代码?刷新整页后如何获取用户配置文件对象?

请帮忙。

最安全的解决方案是将JWT存储在仅限HTTPS的cookie中,然后向服务器发出请求以获取用户对象。

如果你想避免对服务器的额外调用,你需要发挥创意。 我正在尝试的一种方法是将 JWT 的声明正文存储在客户端上 - 仅存储正文,不包括签名。 排除签名后,"令牌"不再是 JWT,不能用于身份验证,从而防止实际访问令牌从本地存储中被盗。

但是,这确实假设了有关声明正文的两件事:

1) 信息不透明,不包含有关用户的个人身份信息 (PII)(本地存储容易受到 XSS 攻击)。

2) 如果在本地存储中修改此对象,您的 Angular 应用程序不会向用户泄露敏感信息(您不应该将敏感信息存储在您的 Angular 应用程序中,它应该受到 API 的保护)

3) 与所有基于 cookie 的身份验证策略一样,您正在保护自己免受 CSRF 攻击

我在 Stormpath 工作,最近写了一篇关于这个主题的博客文章:单页应用程序的基于令牌的身份验证。

希望这有帮助!

为了简单起见,我将只存储 JWT 并实现一个额外的 ajax 调用来获取用户配置文件。

但是,如果您绝对想避免这一次调用,则可以考虑使用非对称签名的 JWT 而不是加密的 JWT,然后在客户端提取数据,假设您控制 JWT 的创建。