package com.example.demo.security; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; 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; import java.util.Map; @Component public class LearningJwtUtil { public static final String AUTH_COOKIE_NAME = "learning_demo_token"; @Value("${learning.auth.jwt.secret}") private String secret; @Value("${learning.auth.jwt.expiration:86400000}") private long expiration; private SecretKey key() { return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)); } public String generateToken(String username) { Date now = new Date(); return Jwts.builder() .claims(Map.of("username", username)) .subject(username) .issuedAt(now) .expiration(new Date(now.getTime() + expiration)) .signWith(key(), Jwts.SIG.HS256) .compact(); } public boolean validate(String token) { try { parse(token); return true; } catch (Exception e) { return false; } } public String username(String token) { return parse(token).getSubject(); } public Map claims(String token) { return Map.copyOf(parse(token)); } public long expirationMillis() { return expiration; } private Claims parse(String token) { return Jwts.parser().verifyWith(key()).build().parseSignedClaims(token).getPayload(); } }