한달만에 살이 너무 많이 쩌셔... 당황스러운데
OAuth2로그인 과정은 이 목록 첫 파트에 가장 잘 나와있으니까 그걸 참고하면 될 것 같다.
따라서 주요로직정도만 살펴보자!
DefaultOAuth2UserService
구현DefaultOAuth2UserService
클래스의 loadUser
메서드가 소셜 로그인의 사용자 유저 정보를 전달받아 처리를 하게 된다.코드가 깔끔한 것 같지는 않아서 한 부분부분 설명을 하겠다!
@Service
public class CustomOAuth2UserService extends DefaultOAuth2UserService {
@Override
//OAuth2 로그인 성공 후 실행되는 메서드 (이후 SecurityConfig 등록 예정)
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
OAuth2User oAuth2User = super.loadUser(userRequest);
String registrationID = userRequest.getClientRegistration().getRegistrationId();
OAuth2Response oAuth2Response = null;
if (registrationID.equals("naver")) {
oAuth2Response = new NaverResponse(oAuth2User.getAttributes());
} else if (registrationID.equals("google")) {
oAuth2Response = new GoogleResponse(oAuth2User.getAttributes());
} else {
return null;
}
{sub=114345949617548919515, name=진서현, given_name=서현, family_name=진, picture=https://lh3.googleusercontent.com/a/ACg8ocIbf__5_362xdsQqSFQ_MPmuH5AB4DNECjtdi08WZAJY-6MZg=s96-c, email=15roa1121@gmail.com, email_verified=true}
public class GoogleResponse implements OAuth2Response{
private final Map<String, Object> attribute;
public GoogleResponse(Map<String, Object> attribute) {
this.attribute = attribute;
}
@Override
public String getProvider() {
return "google";
}
~~나머지 메서드 생략~~
}
네이버의 경우
[{id=t3CIbWd0qvGF24X-A4O_xkXu8b386UXG0OnoQxwLfJs, email=jin011228@naver.com, name=진서현}], Granted Authorities: [[OAUTH2_USER]], User Attributes: [{resultcode=00, message=success, response={id=t3CIbWd0qvGF24X-A4O_xkXu8b386UXG0OnoQxwLfJs, email=jin011228@naver.com, name=진서현}}]
public class NaverResponse implements OAuth2Response {
private final Map<String, Object> attribute;
public NaverResponse(Map<String, Object> attribute) {
this.attribute = (Map<String, Object>) attribute.get("response");
}
@Override
public String getProvider() {
return "naver";
}
~~나머지 메서드 생략~~
}
username
을 만드는 로직이 있다. String username = oAuth2Response.getProvider() + " " + oAuth2Response.getProviderId();
UserEntity existData = userRepository.findByUsername(username);
if (existData == null) {
//처음 로그인한 경우 -> 회원가입을 시켜야한다.
UserEntity userEntity = new UserEntity();
userEntity.setUsername(username);
userEntity.setEmail(oAuth2Response.getEmail());
userEntity.setName(oAuth2Response.getName());
userEntity.setRole("ROLE_USER");
userRepository.save(userEntity);
UserDTO userDTO = new UserDTO();
userDTO.setUsername(username);
userDTO.setName(oAuth2Response.getName());
userDTO.setRole("ROLE_USER");
return new CustomOAuth2User(userDTO);
}
else {
//이미 회원가입이 된 유저인 경우
//이메일이 업데이트 되었을 수도 있으니까
existData.setEmail(oAuth2Response.getEmail());
existData.setName(oAuth2Response.getName());
userRepository.save(existData);
UserDTO userDTO = new UserDTO();
userDTO.setUsername(existData.getUsername());
userDTO.setName(oAuth2Response.getName());
userDTO.setRole(existData.getRole());
return new CustomOAuth2User(userDTO);
}
하늘이 참 예쁘당