|
| 1 | +package cmf.commitField.domain.user.service; |
| 2 | + |
| 3 | +import cmf.commitField.domain.user.entity.CustomOAuth2User; |
| 4 | +import cmf.commitField.domain.user.entity.User; |
| 5 | +import cmf.commitField.domain.user.repository.UserRepository; |
| 6 | +import org.springframework.security.oauth2.client.userinfo.DefaultOAuth2UserService; |
| 7 | +import org.springframework.security.oauth2.client.userinfo.OAuth2UserRequest; |
| 8 | +import org.springframework.security.oauth2.core.user.OAuth2User; |
| 9 | +import org.springframework.stereotype.Service; |
| 10 | + |
| 11 | +import java.util.Map; |
| 12 | +import java.util.Optional; |
| 13 | + |
| 14 | +@Service |
| 15 | +public class CustomOAuth2UserService extends DefaultOAuth2UserService { |
| 16 | + private final UserRepository userRepository; |
| 17 | + |
| 18 | + public CustomOAuth2UserService(UserRepository userRepository) { |
| 19 | + this.userRepository = userRepository; |
| 20 | + } |
| 21 | + |
| 22 | + @Override |
| 23 | + public OAuth2User loadUser(OAuth2UserRequest userRequest) { |
| 24 | + OAuth2User oauthUser = super.loadUser(userRequest); |
| 25 | + |
| 26 | + Map<String, Object> attributes = oauthUser.getAttributes(); |
| 27 | + String username = (String) attributes.get("login"); // GitHub ID |
| 28 | + String email = (String) attributes.get("email"); |
| 29 | + String name = (String) attributes.get("name"); |
| 30 | + String avatarUrl = (String) attributes.get("avatar_url"); |
| 31 | + |
| 32 | + // 이메일이 없는 경우를 대비하여 기본값 설정 |
| 33 | + if (email == null) { |
| 34 | + email = username + "@github.com"; |
| 35 | + } |
| 36 | + |
| 37 | + Optional<User> existingUser = userRepository.findByUsername(username); |
| 38 | + User user; |
| 39 | + if (existingUser.isPresent()) { |
| 40 | + user = existingUser.get(); |
| 41 | + user.setAvatarUrl(avatarUrl); |
| 42 | + user.setEmail(email); // GitHub에서 이메일이 변경될 수도 있으니 업데이트\ |
| 43 | + } else { |
| 44 | + user = new User(username, email, name, avatarUrl, User.Role.USER, null, null, null); |
| 45 | + userRepository.save(user); |
| 46 | + } |
| 47 | + |
| 48 | + return new CustomOAuth2User(oauthUser, user); |
| 49 | + } |
| 50 | +} |
0 commit comments