package com.example.rezevirajmasa.demo.config; import com.auth0.jwt.JWT; import com.auth0.jwt.JWTVerifier; import com.auth0.jwt.algorithms.Algorithm; import com.auth0.jwt.interfaces.DecodedJWT; import com.example.rezevirajmasa.demo.dto.UserDto; import com.example.rezevirajmasa.demo.service.UserService; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import jakarta.annotation.PostConstruct; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; import java.util.*; import java.util.function.Function; @RequiredArgsConstructor @Component public class UserAuthProvider { @Value("${security.jwt.token.secret-key:secret:value}") private String secretKey; private final UserService userService; @PostConstruct protected void init() { secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes()); } public String generateToken(UserDetails userDetails){ Map claims = new HashMap<>(); return createToken(userDetails.getUsername()); } public String createToken(String login) { Date now = new Date(); Date validity = new Date(now.getTime() + 3_600_000); return JWT.create() .withIssuer(login) .withIssuedAt(now) .withExpiresAt(validity) .sign(Algorithm.HMAC256(secretKey)); } public Authentication validateToken(String token) { JWTVerifier verifier = JWT.require(Algorithm.HMAC256(secretKey)).build(); DecodedJWT decoded = verifier.verify(token); UserDto user = userService.findByEmail(decoded.getIssuer()); return new UsernamePasswordAuthenticationToken(user, null, Collections.emptyList()); } public String extractUsername(String token) { return extractClaim(token, Claims::getSubject); } public Date extractExpiration(String token) { return extractClaim(token, Claims::getExpiration); } public T extractClaim(String token, Function claimsResolver) { final Claims claims = extractAllClaims(token); return claimsResolver.apply(claims); } private Claims extractAllClaims(String token) { return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody(); } private Boolean isTokenExpired(String token) { return extractExpiration(token).before(new Date()); } }