TokenProvider.java 4.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package rocks.zipcode.io.security.jwt;
  2. import java.nio.charset.StandardCharsets;
  3. import java.security.Key;
  4. import java.util.*;
  5. import java.util.stream.Collectors;
  6. import javax.annotation.PostConstruct;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  10. import org.springframework.security.core.Authentication;
  11. import org.springframework.security.core.GrantedAuthority;
  12. import org.springframework.security.core.authority.SimpleGrantedAuthority;
  13. import org.springframework.security.core.userdetails.User;
  14. import org.springframework.stereotype.Component;
  15. import org.springframework.util.StringUtils;
  16. import io.github.jhipster.config.JHipsterProperties;
  17. import io.jsonwebtoken.*;
  18. import io.jsonwebtoken.io.Decoders;
  19. import io.jsonwebtoken.security.Keys;
  20. @Component
  21. public class TokenProvider {
  22. private final Logger log = LoggerFactory.getLogger(TokenProvider.class);
  23. private static final String AUTHORITIES_KEY = "auth";
  24. private Key key;
  25. private long tokenValidityInMilliseconds;
  26. private long tokenValidityInMillisecondsForRememberMe;
  27. private final JHipsterProperties jHipsterProperties;
  28. public TokenProvider(JHipsterProperties jHipsterProperties) {
  29. this.jHipsterProperties = jHipsterProperties;
  30. }
  31. @PostConstruct
  32. public void init() {
  33. byte[] keyBytes;
  34. String secret = jHipsterProperties.getSecurity().getAuthentication().getJwt().getSecret();
  35. if (!StringUtils.isEmpty(secret)) {
  36. log.warn("Warning: the JWT key used is not Base64-encoded. " +
  37. "We recommend using the `jhipster.security.authentication.jwt.base64-secret` key for optimum security.");
  38. keyBytes = secret.getBytes(StandardCharsets.UTF_8);
  39. } else {
  40. log.debug("Using a Base64-encoded JWT secret key");
  41. keyBytes = Decoders.BASE64.decode(jHipsterProperties.getSecurity().getAuthentication().getJwt().getBase64Secret());
  42. }
  43. this.key = Keys.hmacShaKeyFor(keyBytes);
  44. this.tokenValidityInMilliseconds =
  45. 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt().getTokenValidityInSeconds();
  46. this.tokenValidityInMillisecondsForRememberMe =
  47. 1000 * jHipsterProperties.getSecurity().getAuthentication().getJwt()
  48. .getTokenValidityInSecondsForRememberMe();
  49. }
  50. public String createToken(Authentication authentication, boolean rememberMe) {
  51. String authorities = authentication.getAuthorities().stream()
  52. .map(GrantedAuthority::getAuthority)
  53. .collect(Collectors.joining(","));
  54. long now = (new Date()).getTime();
  55. Date validity;
  56. if (rememberMe) {
  57. validity = new Date(now + this.tokenValidityInMillisecondsForRememberMe);
  58. } else {
  59. validity = new Date(now + this.tokenValidityInMilliseconds);
  60. }
  61. return Jwts.builder()
  62. .setSubject(authentication.getName())
  63. .claim(AUTHORITIES_KEY, authorities)
  64. .signWith(key, SignatureAlgorithm.HS512)
  65. .setExpiration(validity)
  66. .compact();
  67. }
  68. public Authentication getAuthentication(String token) {
  69. Claims claims = Jwts.parser()
  70. .setSigningKey(key)
  71. .parseClaimsJws(token)
  72. .getBody();
  73. Collection<? extends GrantedAuthority> authorities =
  74. Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
  75. .map(SimpleGrantedAuthority::new)
  76. .collect(Collectors.toList());
  77. User principal = new User(claims.getSubject(), "", authorities);
  78. return new UsernamePasswordAuthenticationToken(principal, token, authorities);
  79. }
  80. public boolean validateToken(String authToken) {
  81. try {
  82. Jwts.parser().setSigningKey(key).parseClaimsJws(authToken);
  83. return true;
  84. } catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
  85. log.info("Invalid JWT signature.");
  86. log.trace("Invalid JWT signature trace: {}", e);
  87. } catch (ExpiredJwtException e) {
  88. log.info("Expired JWT token.");
  89. log.trace("Expired JWT token trace: {}", e);
  90. } catch (UnsupportedJwtException e) {
  91. log.info("Unsupported JWT token.");
  92. log.trace("Unsupported JWT token trace: {}", e);
  93. } catch (IllegalArgumentException e) {
  94. log.info("JWT token compact of handler are invalid.");
  95. log.trace("JWT token compact of handler are invalid trace: {}", e);
  96. }
  97. return false;
  98. }
  99. }