JWTS token for Spring REST API
01-07-2022We can integrate JWTS token for Spring REST API by using following component:
import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtParser; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.impl.DefaultClaims; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import java.util.Date; import java.util.function.Function; @Component public class JwtUtils { private static final Logger logger = LoggerFactory.getLogger(JwtUtils.class); private final String jwtSecret = "4528482B4D6251655468576D5A7134743777217A25432646294A404E63526655"; private final int jwtExpirationMs = 30_60_1000; public String generateJwtToken(String username, String reportingUnit) { return Jwts.builder() .setSubject(username) .setIssuedAt(new Date()) .setHeaderParam("ReportingUnit", reportingUnit) .setExpiration(expirationDate()) .signWith(Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSecret))) .compact(); } private Date expirationDate(){ return new Date((new Date()).getTime() + jwtExpirationMs); } public String getUserNameFromJwtToken(String token) { DefaultClaims result = (DefaultClaims) jwtBuilder().parse(token).getBody(); return result.getSubject(); } public String getReportingHeader(String token) { token = token.replace("Bearer ",""); return (String) jwtBuilder() .parse(token).getHeader().get("ReportingUnit"); } public boolean validateJwtToken(String token) { try { return isSigned(token)&& !isTokenExpired(token) ; } catch (Exception e) { return false; } } private JwtParser jwtBuilder() { return Jwts.parserBuilder() .setSigningKey(Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSecret))).build(); } public boolean isSigned(String token) { return jwtBuilder().isSigned(token); } public boolean isTokenExpired(String token) { return expirationDate().getTime() - extractExpiration(token).getTime() > jwtExpirationMs; } private Date extractExpiration(String token) { return extractClaim(token, Claims::getExpiration); } private <T> T extractClaim(String token , Function<Claims, T> claimResolver) { final Claims claim= extractAllClaims(token); return claimResolver.apply(claim); } private Claims extractAllClaims(String token) { return jwtBuilder().parseClaimsJws(token).getBody(); } }