存储 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 令牌的主要内容,如果未能解决你的问题,请参考以下文章