从 Spring Boot Rest Controller 访问 JWT 令牌

Posted

技术标签:

【中文标题】从 Spring Boot Rest Controller 访问 JWT 令牌【英文标题】:Accessing JWT Token from a Spring Boot Rest Controller 【发布时间】:2019-07-21 09:55:04 【问题描述】:

我正在使用 Spring Boot 实现 REST API,并使用 JWT 和 Oauth 2 保护它。

我对身份验证和生成访问令牌没有任何问题。

当用户发出请求时,我想从控制器访问其 JWT 令牌。

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<AppUser> getUsers(OAuth2Authentication auth) 
    logger.info("CREDENTIALS:" + auth.getCredentials().toString());
    logger.info("PRINCIPAL:" + auth.getPrincipal().toString());
    logger.info("OAuth2Request:" + auth.getOAuth2Request());
    logger.info("UserAuthentication:" + auth.getUserAuthentication());
    return userService.findAllUsers();

我尝试了类似上面的方法,但无法访问令牌,我只得到用户名。有没有办法在 Spring Boot 中实现这一点?

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

鞑靼人,

UI 是否在请求中将令牌作为标头发送?如果是这种情况,那么您可以在方法中使用 @RequestHeader 注释获取该值

@RequestMapping(value = "/users", method = RequestMethod.GET)
public List<AppUser> getUsers(OAuth2Authentication auth, @RequestHeader (name="Authorization") String token) 

注意:对于此示例,Authorization 是包含令牌的标头名称,这可以是自定义标头名称。

干杯!

【讨论】:

【参考方案2】:

Karl 提供的答案应该可以解决您的问题。

除了那个答案,你可以使用下面的方法,在代码的任何地方访问令牌

public static String getToken() 
    String token = null;
    var authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication != null) 
      token = ((OAuth2AuthenticationDetails) authentication.getDetails()).getTokenValue();
    
    return token;
  

【讨论】:

OAuth2AuthenticationDetails 已弃用 @OsamaSbieh 你能提供一个链接显示最新的(2.4.0.RELEASE)已被弃用吗?查看 Maven 存储库并深入了解 JAR,这似乎不是真的。只有 ImplicitGrantService 被弃用,因为它被发现是不安全的,并且正在为未来的版本重新设计,因此可以正确构建和尊重隐式授权类型。 只是为了投光,是的,它已被弃用 github.com/spring-projects/spring-security-oauth/blob/…

以上是关于从 Spring Boot Rest Controller 访问 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

从 Spring Boot Rest Controller 访问 JWT 令牌

从 Spring Boot 中使用 rest api,架构问题

在spring boot应用程序中从自己的rest api调用另一个rest api

Spring boot:无法从另一个 Origin 访问安全资源 - CORS - Spring Security - Spring data rest

使用 Spring Boot 从不同端口提供 REST API 和静态内容

如何使用 Spring Boot 应用程序从 Rest API 返回 html