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

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

【问题讨论】:

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

标签: java spring spring-mvc spring-boot jwt


【解决方案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”和一个空格。
    猜你喜欢
    • 2018-12-07
    • 2019-05-06
    • 1970-01-01
    • 2021-12-27
    • 2020-07-24
    • 2016-03-15
    • 2020-03-23
    • 2015-09-15
    • 2017-10-08
    相关资源
    最近更新 更多