구글 로그인이 정말 몇일째 작동하지 않습니다 ㅠㅠ...
@Service
public class CustomOAuth2LoginSuccessHandler implements AuthenticationSuccessHandler {
private static final Logger logger = LoggerFactory.getLogger(AuthController.class);
@Autowired
private CustomOAuth2UserService customOAuth2UserService;
@Autowired
private OAuth2AuthorizedClientService authorizedClientService;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
logger.info("Authentication Success - Principal: {}", authentication.getPrincipal());
OAuth2AuthenticationToken authToken = (OAuth2AuthenticationToken) authentication;
OAuth2User oAuth2User = authToken.getPrincipal();
OAuth2AuthorizedClient authorizedClient = authorizedClientService
.loadAuthorizedClient(authToken.getAuthorizedClientRegistrationId(), authToken.getName());
if (authorizedClient != null) {
OAuth2UserRequest userRequest = new OAuth2UserRequest(authorizedClient.getClientRegistration(), authorizedClient.getAccessToken());
customOAuth2UserService.processOAuth2User(oAuth2User, userRequest);
}
// 인증 후 리디렉션 또는 추가 로직 구현
response.sendRedirect("/home"); // 예시로 '/home'으로 리디렉션
}
}@Service
public class CustomOAuth2UserService implements OAuth2UserService<OAuth2UserRequest, OAuth2User> {
private static final Logger logger = LoggerFactory.getLogger(CustomOAuth2UserService.class);
@Autowired
private MembersRepository membersRepository;
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
logger.info("loadUser1");
try {
OAuth2UserService<OAuth2UserRequest, OAuth2User> delegate = new DefaultOAuth2UserService();
OAuth2User oAuth2User = delegate.loadUser(userRequest);
logOAuth2UserInfo(oAuth2User); // 로그 출력
processOAuth2User(oAuth2User, userRequest);
return oAuth2User;
} catch (Exception e) {
logger.error("Error loading OAuth2User", e);
throw e;
}
}
private void logOAuth2UserInfo(OAuth2User oAuth2User) {
logger.info("OAuth2User Attributes: {}", oAuth2User.getAttributes());
if (oAuth2User.getAttribute("email") == null) {
logger.warn("OAuth2User does not contain email attribute");
}
}
@Transactional
public void processOAuth2User(OAuth2User oAuth2User, OAuth2UserRequest userRequest) {
String email = oAuth2User.getAttribute("email");
String name = oAuth2User.getAttribute("name");
logger.info("Processing user - Email: {}, Name: {}", email, name);
Optional<MembersEntity> existingMember = membersRepository.findByEmail(email);
MembersEntity member;
if (existingMember.isPresent()) {
member = existingMember.get();
member.updateFromGoogle(name, email);
logger.info("Updated existing user: {}", email);
} else {
member = MembersEntity.builder()
.email(email)
.name(name)
.nickname(name + "_google")
.role(Role.ROLE_CUSTOMER)
.build();
logger.info("Saving new user: {}", email);
}
try {
membersRepository.save(member);
logger.info("User saved/updated successfully: {}", email);
} catch (Exception e) {
logger.error("Error saving/updating user: {}", email, e);
}
membersRepository.save(member);
}
} @RestController
public class LoginController {
private static final Logger logger = LoggerFactory.getLogger(AuthController.class);
@GetMapping("/login/oauth2")
public void redirectToLoginPage(HttpServletResponse response) throws IOException {
// OAuth2 로그인 페이지로 리디렉션
logger.info("리다이렉트");
response.sendRedirect("/oauth2/authorization/google");
}
}