存储 JWT 令牌

Posted

技术标签:

【中文标题】存储 JWT 令牌【英文标题】:Storing a JWT token 【发布时间】:2019-02-01 16:36:00 【问题描述】:

我正在使用 JWT 进行身份验证。现在我想将这个生成的令牌存储在一个类中,以便任何其他类都可以使用它,直到会话到期。最好的方法是什么。我的应用程序在 Spring Boot 中。 添加更多。我正在制作一个客户端,该客户端使用凭据访问休息 Web 服务以获取令牌。现在我需要将此令牌存储在某处,以便进一步的休息请求可以使用它。 将令牌存储在httpSession中并进一步检索它是否可以。

【问题讨论】:

你不应该 docs.spring.io/autorepo/docs/spring-security/3.2.1.RELEASE/… @MehrajMalik 听起来这是在客户端上,它肯定需要存储令牌。 @MehrajMalik 你完全确定你在说什么吗因为我见过一些这样做非常方便的情况...... 这实际上是不熟悉基于令牌的身份验证概念的人经常提出的问题。通常,您不要存储 JWT 的事实要么被文章作者忽视,要么未被强调。您可以阅读 JWT 的官方文档以更好地了解其工作原理:jwt.io/introduction 【参考方案1】:

存储 JWT 令牌通常不是一个好主意,因为它应该包含识别和授权服务用户的所有信息,而不会影响数据库/持久层。

但也许有些情况需要在用户数据中持久化它。在这种情况下,您可以将其存储在表/集合中,并在验证用户身份时检索它。

如果您使用的是 Spring + Spring Security,则可以在自定义 User 实现中填充 token 字段。

您可以通过这种方式检索用户数据:

CustomUser userDetails = (CustomUser)SecurityContextHolder.getContext().getAuthentication().getPrincipal();

【讨论】:

【参考方案2】:

最好不要存储 JWT 令牌以保护其免受 CSRF 的影响。

但是,如果您想保留或使用它,Spring Boot 中的一种方法是您可以在任何休息请求中包含 @RequestHeader 参数,其值为 "Authorization" 然后您就可以从中取出 jwt 令牌并根据您的功能使用它:

@GetMapping("/abc")
public ResponseEntity<String> getToken(
    @RequestHeader(value="Authorization")  String authorizationHeader)
    String jwt = authorizationHeader.substring(7);
    //your functionality
    return ResponseEntity.ok("JWT Token successfully retrieved");

【讨论】:

substring(7) 用于摆脱我假设的"Bearer " 字符串?是否保证它始终为 7 个字符长?否则按空格分割可能更可取。 是的,它用于摆脱“Bearer”字符串。是的,假设 jwt 附加了“Bearer”和一个空格。

以上是关于存储 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

为啥不将 JWT 访问令牌存储在内存中并在 cookie 中刷新令牌?

在 Redis 中存储 JWT 令牌的标准做法是啥?

在哪里存储 JWT 令牌?

我应该在哪里存储 JWT 令牌?

jwt 访问令牌和刷新令牌流

在 Django REST 框架中使用 JWT 时,刷新令牌和访问令牌存储在哪里?