package mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.impl; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.io.Decoders; import io.jsonwebtoken.security.Keys; import mk.ukim.finki.predmeti.internettehnologii.jobvistabackend.service.intef.JwtService; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Service; import java.security.Key; import java.util.Date; import java.util.Map; import java.util.function.Function; @Service public class JwtServiceImpl implements JwtService { private final static String SECRET_KEY = "7191b1d33668d4a2316a02f9a40798b77bccd22173bd882c93a0a916a5e921d1"; public String generateToken(UserDetails userDetails) { return Jwts.builder().setSubject(userDetails.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24)) .signWith(getSigninKey(), SignatureAlgorithm.HS256) .compact(); } @Override public String generateRefreshToken(Map extraClaims, UserDetails userDetails) { return Jwts.builder().setClaims(extraClaims).setSubject(userDetails.getUsername()) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 24 * 7)) .signWith(getSigninKey(), SignatureAlgorithm.HS256) .compact(); } private Key getSigninKey() { byte[] key = Decoders.BASE64.decode(SECRET_KEY); return Keys.hmacShaKeyFor(key); } public String extractUsername(String token) { return extractClaim(token, Claims::getSubject); } private Claims extractAllClaims(String token) { return Jwts.parserBuilder().setSigningKey(getSigninKey()).build().parseClaimsJws(token).getBody(); } public T extractClaim(String token, Function claimsResolver) { final Claims claims = extractAllClaims(token); return claimsResolver.apply(claims); } public boolean isTokenValid(String token, UserDetails userDetails) { final String username = extractUsername(token); return username.equals(userDetails.getUsername()) && !isTokenExpired(token); } private boolean isTokenExpired(String token) { return extractClaim(token, Claims::getExpiration).before(new Date()); } }