앞서 OAuth를 이용하여 구글로그인을 하는 방법을 알아보았습니다.
💡 하지만 아직 회원가입이 안되어있어서 이제 강제로 회원가입을 시킬것입니다.
이번에는 4-1은 진행하지 않을것입니다.
TIP
구글 로그인이 완료되면, Code를 받는것이 아니라, AccessToken + 사용자 프로필정보를 받습니는다.
우선 프로필 정보를 받아오기 위한 위한 필터를 등록합니다.
.oauth2Login()
.loginPage("/view/v1/start")
.userInfoEndpoint()
.userService(principalOauth2UserService) //구글 로그인 완료된 후 강제로그인을 위한 과정
.and()
우리는 구글로그인이 될때 AccessToken과 사용자 프로필을 가져왔습니다.
이때 그 정보들을 이용해서 강제 로그인을 시킬 예정입니다.
그러기 위해서는 loadUser()를 활용해야합니다.
구글 로그인 클릭 -> 구글로그인창 -> 로그인 완료 -> code를 리턴(OAuth-Client라이브러리가 받음) -> AccessToken요청 -> AccessToken을 받으면 userRequest정보가 도착합니다.
userRequest를 받으면 -> 회원 프로필을 받아야 합니다.
그때 사용하는 함수가 super.loadUser(userRequest)
입니다.
아래 코드를 보면 매개변수로 userRequest를 받고 받은 변수를 활용하여 super.loadUser(userRequest)
함수를 호출하는것을 확인 할 수 있습니다.
즉, super.loadUser(userRequest)
는 회원 프로필을 받아주는 함수입니다.
@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
System.out.println("getClientRegistration: " + userRequest.getClientRegistration());
System.out.println("getAccessToken: " + userRequest.getAccessToken().getTokenValue());
System.out.println("getAttributes: " + super.loadUser(userRequest),getAttributes);
return new super.loadUser(userRequest);
}
}
userRequest에 AccessToken와 사용자 프로필이 담겨있습니다.
loadUser()는 userRequest를 받을 수 있는 메소드 입니다.
사실 AccessToken은 필요가 없습니다.
왜냐하면 getAttributes의 정보로 강제 회원가입을 시킬것이기 때문입니다.
userRequest에서 유저 정보를 확인해 봅시다.
getAttributes
정보getAttributes: {
sub={아이디 고유 식별번호},
name={이름},
given_name={given_name},
picture={사진정보}
email={이메일 정보},
email_verified=true,
locale=ko
}
ClientRegistration{registrationId='google',
clientId='281243666084-ufae9driluifj5j4npfld5psgettt2pu.apps.googleusercontent.com'
...
이제 getAttributes
와 getClientRegistration
정보를 갖고 회원가입을 시킵니다.
username
= google_sub식별번호
password
= "원하는 값" -> 암호화하여 저장
email
= email
role
= ROLE_USER
provider
= 구글
providerId
= sub
provider, providerId를 통해 구글, 네이버, 카카오 등 어디서 로그인을 했는지 확인하기 위해 생성합니다.
getClientRegistration에서 가져온 정보를 사용합니다.
자 이제 OAuth2를 이용해 강제 회원가입 시킬 시나리오를 만들어 보았습니다.
다음에는 다형성을통해 UserDetails와 OAuth2User를 받을 수 있는 방법을 소개할 예정입니다.