TokenService.java

package org.petify.backend.services;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.oauth2.jwt.JwtClaimsSet;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtEncoder;
import org.springframework.security.oauth2.jwt.JwtEncoderParameters;
import org.springframework.stereotype.Service;

import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class TokenService {

    @Autowired
    private JwtEncoder jwtEncoder;

    @Autowired
    private JwtDecoder jwtDecoder;

    public String generateJwt(Authentication auth) {
        Instant now = Instant.now();
        Instant expiryTime = now.plus(24, ChronoUnit.HOURS);

        List<String> roles = auth.getAuthorities().stream()
                .map(authority -> {
                    String role = authority.getAuthority();
                    return role.startsWith("ROLE_") ? role.substring(5) : role;
                })
                .collect(Collectors.toList());

        JwtClaimsSet.Builder claimsBuilder = JwtClaimsSet.builder()
                .issuer("http://localhost:9000")
                .issuedAt(now)
                .expiresAt(expiryTime)
                .subject(auth.getName())
                .claim("roles", roles);

        if (auth.getPrincipal() instanceof OAuth2User) {
            addOAuth2Claims(claimsBuilder, (OAuth2User) auth.getPrincipal());
        } else {
            claimsBuilder.claim("auth_method", "form");
        }

        return jwtEncoder.encode(JwtEncoderParameters.from(claimsBuilder.build())).getTokenValue();
    }

    private void addOAuth2Claims(JwtClaimsSet.Builder claimsBuilder, OAuth2User oauth2User) {
        if (oauth2User.getAttribute("userId") != null) {
            claimsBuilder.claim("userId", oauth2User.getAttribute("userId"));
        }

        if (oauth2User.getAttribute("email") != null) {
            claimsBuilder.claim("email", oauth2User.getAttribute("email"));
        }

        if (oauth2User.getAttribute("name") != null) {
            claimsBuilder.claim("name", oauth2User.getAttribute("name"));
        }

        claimsBuilder.claim("auth_method", "oauth2");
    }

    public org.springframework.security.oauth2.jwt.Jwt validateJwt(String token) {
        return jwtDecoder.decode(token);
    }
}