从 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