src/main/java/com/forum/security/JwtProvider.java
package com.forum.security;
import com.forum.exceptions.SpringForumException;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.io.InputStream;
import java.security.*;
import java.security.cert.CertificateException;
import java.time.Instant;
import java.sql.Date;
import static io.jsonwebtoken.Jwts.parser;
import static java.util.Date.from;
@Service
public class JwtProvider {
private KeyStore keyStore;
@Value("${jwt.expiration.time}")
private Long jwtExpirationInMillis;
@PostConstruct
public void init() {
try {
keyStore = KeyStore.getInstance("JKS");
InputStream resourceAsStream = getClass().getResourceAsStream("/springblog.jks");
keyStore.load(resourceAsStream, "secret".toCharArray());
} catch (KeyStoreException | CertificateException | NoSuchAlgorithmException | IOException e) {
throw new SpringForumException("Exception occurred while loading keystore", e);
}
}
public String generateToken(Authentication authentication) {
org.springframework.security.core.userdetails.User principal = (User) authentication.getPrincipal();
return Jwts.builder()
.setSubject(principal.getUsername())
.signWith(getPrivateKey())
.setExpiration(Date.from(Instant.now().plusMillis(jwtExpirationInMillis)))
.compact();
}
public String generateTokenWithUserName(String username) {
return Jwts.builder()
.setSubject(username)
.setIssuedAt(from(Instant.now()))
.signWith(getPrivateKey())
.setExpiration(Date.from(Instant.now().plusMillis(jwtExpirationInMillis)))
.compact();
}
private PrivateKey getPrivateKey() {
try {
return (PrivateKey) keyStore.getKey("springblog", "secret".toCharArray());
} catch (KeyStoreException | NoSuchAlgorithmException | UnrecoverableKeyException e) {
throw new SpringForumException("Exception occured while retrieving public key from keystore", e);
}
}
public boolean validateToken(String jwt) {
parser().setSigningKey(getPublicKey()).parseClaimsJws(jwt);
return true;
}
private PublicKey getPublicKey() {
try {
return keyStore.getCertificate("springblog").getPublicKey();
} catch (KeyStoreException e) {
throw new SpringForumException("Exception occured while " +
"retrieving public key from keystore", e);
}
}
public String getUsernameFromJwt(String token) {
Claims claims = parser()
.setSigningKey(getPublicKey())
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
public long getJwtExpirationInMillis() {
return jwtExpirationInMillis;
}
}