JWTAuthenticationService.java

package com.saltynote.service.security;

import com.saltynote.service.domain.LoginUser;
import com.saltynote.service.domain.transfer.TokenPair;
import com.saltynote.service.domain.transfer.UserCredential;
import com.saltynote.service.service.JwtService;
import com.saltynote.service.service.UserService;
import com.saltynote.service.service.VaultService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.stereotype.Service;

import java.util.Collections;

@Slf4j
@RequiredArgsConstructor
@Service
public class JWTAuthenticationService {

    private final AuthenticationManager authenticationManager;

    private final VaultService vaultService;

    private final JwtService jwtService;

    private final UserService userService;

    public TokenPair authenticate(UserCredential credential, HttpServletRequest request) {

        Authentication auth = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
                credential.getUsername(), credential.getPassword(), Collections.emptyList()));

        LoginUser user = (LoginUser) auth.getPrincipal();
        String accessToken = jwtService.createAccessToken(user);
        String refreshToken = vaultService.fetchOrCreateRefreshToken(user);
        // update current user's lastLoginTime, after user logged in successfully
        userService.saveLoginHistory(user.getId(), request.getHeader(SecurityConstants.REAL_IP_HEADER),
                request.getHeader(SecurityConstants.USER_AGENT_HEADER));
        return new TokenPair(accessToken, refreshToken);

    }

}