Я работаю в проекте Spring Web Api, и мне нужно интегрировать мой API с внешним приложением, которое обеспечит мне аутентификацию и авторизацию. Мне просто нужно проверить токен JWT и передать его претензии моим контроллерам отдыха, что я сделал следующим образом:
public class JwtValidationFilter implements Filter {
private static String uri = "https://<external application domain>/.well-known/jwks";
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
JwtUtil jwtUtil = new JwtUtil(uri);
HttpServletRequest req = (HttpServletRequest) request;
try {
String authHeader = HeaderUtil.extractHeader("Authorization", req);
String[] authArray = authHeader.split(" ");
String token = authArray[1];
Claims claims = jwtUtil.verifyAndGetTokenClaims(token);
request.setAttribute("userClaims", claims);
chain.doFilter(request, response);
}
catch (Exception exception) {
HttpServletResponse res = (HttpServletResponse) response;
res.sendError(401, exception.getMessage());
}
}
И в контроллере я получаю и использую userClaims следующим образом:
@GetMapping("/secret")
public String secret(@RequestAttribute("userClaims") Claims userClaims) {
// DO SOME STUFF
}
Есть ли лучший способ сделать это? Мои решения работают, но выглядят наивными и сложными в обслуживании по мере роста веб-API.
Спасибо всем.