I have a Spring Boot application that requires a JwtAuthenticationToken
passed in a HTTP Authorization
header. The header itself provides a bearer token; Spring is doing some magic that I am currently unaware of to convert that bearer token string into a JwtAuthenticationToken
. I have some code that extracts the user id from the token, which is used to locate the correct resources on the server.
private String getUidFromToken(JwtAuthenticationToken token) { // this is placeholder code to demonstrate what I'm doing with the token } public ResponseEntity<String> getUserProfile(JwtAuthenticationToken token) { String uid = getUidFromToken(token); // rest of the code }
Since I require these tokens in a couple of different places, I decided to look into moving the getUidFromToken
code into a HandlerMethodArgumentResolver
. The trouble I’m having is that I need a JwtAuthenticationToken
, but I only get the bearer token from the Authorization
header as a string.
Is it possible for me to get that JwtAuthenticationToken
instead of a string?
Advertisement
Answer
I figured it out with some help from a professional acquaintance. The trick was to grab the static security context which allows you to get ahold of the current authentication. Then, getting the uid
claim I was looking for was trivial.
I used a Baeldung article to help me scaffold the HandlerMethodArgumentResolver
: https://www.baeldung.com/spring-mvc-custom-data-binder#1-custom-argument-resolver
And here is what I did in the resolveArgument
method:
@Override public Object resolveArgument( MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { final var auth = (JwtAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); final var token = auth.getToken(); if (token.hasClaim("uid")) { return token.getClaimAsString("uid"); } else { return null; } }