Spring Security 구글 로그인 회원정보 받아오기

바그다드·2023년 4월 8일
0

Spring Security

목록 보기
7/17
post-thumbnail

로그인 API를 활용한 로그인 방법

  1. 코드받기(인증)
    2.엑세스토큰 받기(권한)
    3.사용자 정보를 가져오고
  2. 정보를 토대로 회원가입을 자동으로 진행시키기도 한다.
    4-2 (이메일, 전화번호, 이름, 아이디) 에 더해 쇼핑몰일 경우 집주소, 백화점의 경우 vip여부 정보가 필요할 경우에는 추가적인 정보를 추가적으로 넣어야 한다. 이럴 경우 추가 정보를 입력하는 창으로 이동하여 추가 정보를 받아야 한다.

OAuth2를 이용하면 엑세스 토큰과 사용자 프로필 정보를 함께 받아온다.

Security Config 코드 추가

				.....
				.and()
                .oauth2Login()
                .loginPage("/loginForm")
                // 코드 추가
                .userInfoEndpoint()
                .userService(null)
  • userService에는 OAuth2UserService가 들어가야 하나 아직 생성하지 않았으므로 null을 넣자

PrincipalOAuth2UserService 생성

config에 oauth패키지 추가 후 PrincipalOAuth2UserService 생성

@Service
public class PrincipalOauth2UserService extends DefaultOAuth2UserService {

    // 구글로부터 받은 userRequest 데이터에 대한 후처리가 되는 함수
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
}

Security Config 코드 수정

...
    @Autowired
    private PrincipalOauth2UserService principalOauth2UserService;
    ...
    
    			// 코드 추가
                .userInfoEndpoint()
                .userService(principalOauth2UserService)
  • 이제 userService에 null 대신에 principalOauth2UserService를 넣어주자

PrincipalOAuth2UserService 메소드 추가

// 구글로 부터 받은 userRequest데이터를 후처리하는 함수
 @Override
    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) throws OAuth2AuthenticationException {
        // registrationId로 어떤 oauth로 로그인 했는지 알 수 있음
        System.out.println("userRequest : " + userRequest.getClientRegistration());
        System.out.println("userRequest = " + userRequest.getAccessToken().getTokenValue());
        
        // 구글 로그인 버튼 클릭 -> 구글 로그인 창 -> 로그인을 완료 
        // -> code를 리턴(Oauth-client라이브러리 -> AccessToken 요청
        
        // userRequest정보 -> loadUser함수 호출 -> 구글로부터 회원 프로필을 받아줌
        System.out.println("userRequest = " + super.loadUser(userRequest).getAttributes());

        OAuth2User oAuth2User = super.loadUser(userRequest);
        // 회원가입을 강제로 진행해볼 예점
        return super.loadUser(userRequest);
    }
  • 그리고 구글 로그인을 시도해보면 아래와 같이 엑세스 토큰과 사용자 프로필 정보를 가져온 것을 확인할 수 있다.
getClientRegistration : ClientRegistration{registrationId='google', clientId='510342946043-hesh5cb2t1asij1ktqdvvp8mrik37ohk.apps.googleusercontent.com', clientSecret='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', clientAuthenticationMethod=org.springframework.security.oauth2.core.ClientAuthenticationMethod@4fcef9d3, authorizationGrantType=org.springframework.security.oauth2.core.AuthorizationGrantType@5da5e9f3, redirectUri='{baseUrl}/{action}/oauth2/code/{registrationId}', scopes=[email, profile], providerDetails=org.springframework.security.oauth2.client.registration.ClientRegistration$ProviderDetails@3b91c570, clientName='Google'}
getAccessToken = ya29.a0Ael9sCPz9XVTqr2LdMGnh6AI1B8zyCERtbyOgMfcd0mtqeOk2mgjlMsUHy_2qXtfxxxcZ_Gh3CDkfxG2aziJz2raQh-CV-7MbuFKcKUoutHrarbMxif8JDDJ0DFyzz457fZGsv4K4DfyPcpdkltcymPqAJx0LAaCgYKAY0SARASFQF4udJhZPEig6jBbyILauToC8ASnQ0165
getAttributes = {sub=105156291955329144943, name=박민, given_name=민, family_name=박, picture=https://lh3.googleusercontent.com/a/AGNmyxaP5PqWp_Owhh4DmwwCmzSYx_4114WaKnhyuOpQ=s96-c, email=magicofclown@gmail.com, email_verified=true, locale=ko}
  • 이제 이 정보를 기반으로 자동 회원가입을 진행해보자. 위의 결과에서 getAttributes를 보면
{sub=105156291955329144943, 
name=박민, 
given_name=민,
family_name=박, 
picture=https://lh3.googleusercontent.com/a/AGNmyxaP5PqWp_Owhh4DmwwCmzSYx_4114WaKnhyuOpQ=s96-c, email=magicofclown@gmail.com, 
email_verified=true, 
locale=ko}
  • 이러한 정보를 띄우고 있는데 이것을 이용해서 아래처럼 데이터를 활용해보자
username = google_{sub=105156291955329144943
password = "암호화(겟인데어)"
email = "magicofclown@gmail.com"
role = "ROLE_USER"
provider = "google"
providerId = 105156291955329144943

User엔티티 수정

  • 어떤 OAuth를 사용해서 가입을 했는지 확인하기 위해 속성을 추가해보자
@Entity
@Data
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String username;
    private String password;
    private String email;
    private String role; // ROLE_USER, ROLE_ADMIN
    
    // provider / providerId 추가
    private String provider; // 값을 받아온 도메인('google')
    private String providerId; // 도메인에서 사용하는 id('sub값')

    private Timestamp loginDate; // 로그인 한 날짜
    @CreationTimestamp
    private Timestamp createDate;
}
  • 이제 이 정보를 토대로 회원가입을 강제로 진행할 수 있다.
profile
꾸준히 하자!

0개의 댓글