package ru.soune.nocopy.adminpanel.util; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.util.Date; @Component public class JwtUtil { @Value("${jwt.secret:Z29nb3Bvd2VycmFuZ2VydHVtYmF5YW1iZjMyNDIyMjh3aW5lcndpbmVy}") private String secret; @Value("${jwt.expiration:3600000}") private Long expiration; private SecretKey getSigningKey() { return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)); } public String generateToken(String email, Long userId) { return Jwts.builder() .setSubject(email) .claim("userId", userId) .setIssuedAt(new Date()) .setExpiration(new Date(System.currentTimeMillis() + expiration)) .signWith(getSigningKey(), SignatureAlgorithm.HS256) .compact(); } public Claims extractClaims(String token) { return Jwts.parser() .setSigningKey(getSigningKey()) .build() .parseClaimsJws(token) .getBody(); } public String extractEmail(String token) { return extractClaims(token).getSubject(); } public Long extractUserId(String token) { return extractClaims(token).get("userId", Long.class); } public boolean isTokenExpired(String token) { return extractClaims(token).getExpiration().before(new Date()); } public boolean validateToken(String token) { try { return !isTokenExpired(token); } catch (Exception e) { return false; } } }