JwtService.java
package com.ctrlbuy.webshop.security;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.JwtException;
import io.jsonwebtoken.JwtParser;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.crypto.SecretKey;
import java.util.Optional;
import jakarta.annotation.PostConstruct;
@Service
public class JwtService {
@Value("${jwt.secret:development-only-secret-change-in-prod}")
private String jwtSecret;
// Ändrad från jwt.expiration till jwt.expirationMs
@Value("${jwt.expirationMs}")
private int jwtExpirationMs;
@Value("${jwt.refresh-token.expiration}")
private long refreshTokenExpirationMs;
private SecretKey signingKey;
@PostConstruct
public void init() {
if (jwtSecret == null || jwtSecret.isEmpty()) {
throw new IllegalStateException("JWT Secret är null eller saknas i application.properties");
}
this.signingKey = Keys.hmacShaKeyFor(jwtSecret.getBytes());
System.out.println("✅ JWT Secret och Expiration injicerade korrekt: " + jwtSecret + " | " + jwtExpirationMs);
}
public String generateToken(String username) {
return Jwts.builder()
.claim("sub", username)
.claim("iat", System.currentTimeMillis() / 1000)
.claim("exp", (System.currentTimeMillis() + jwtExpirationMs) / 1000)
.signWith(signingKey, Jwts.SIG.HS256)
.compact();
}
public String generateRefreshToken(String username) {
return Jwts.builder()
.claim("sub", username)
.claim("iat", System.currentTimeMillis() / 1000)
.claim("exp", (System.currentTimeMillis() + refreshTokenExpirationMs) / 1000)
.signWith(signingKey, Jwts.SIG.HS256)
.compact();
}
public Optional<String> extractUsername(String token) {
try {
JwtParser parserInstance = Jwts.parser()
.verifyWith(signingKey)
.build();
Jws<Claims> claimsJws = parserInstance.parseSignedClaims(token);
Claims claims = claimsJws.getPayload();
return Optional.ofNullable(claims.get("sub", String.class));
} catch (JwtException e) {
return Optional.empty();
}
}
public boolean isTokenValid(String token, String username) {
Optional<String> extractedUsername = extractUsername(token);
return extractedUsername.isPresent() && extractedUsername.get().equals(username);
}
}