我目前正在处理从 Google 获得的 JWT 令牌。包括谷歌在内,几乎所有的授权服务器都提供了诸如GET /userInfo之类的REST API,你可以在请求头或URL中携带JWT令牌作为GET参数,然后验证JWT令牌是否有效、未过期等。
由于验证 JWT 令牌通常是无状态的,因此这些 API 通常具有很大的限制,您可以根据需要多次调用它们。
我假设您已经集成了 Spring 安全性,然后您可以添加一个过滤器。这样,每个请求都必须在标头中验证其令牌。
@Service
public class TokenAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
try {
String header = request.getHeader("Authorization");
RestTemplate restTemplate = new RestTemplate(); // If you use Google SDK, xxx SDK, you do not have to use restTemplate
String userInfoUrl = "https://example.com/api/userInfo";
HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", header);
HttpEntity entity = new HttpEntity(headers);
ResponseEntity<String> response = restTemplate.exchange(
userInfoUrl, HttpMethod.GET, entity, String.class, param);
User user = response.getBody(); // Get your response and figure out if the Token is valid.
// If the token is valid? Check it here....
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
} catch (Exception ex) {
logger.error("Could not set user authentication in security context", ex);
}
filterChain.doFilter(request, response);
}
}