Oauth2로 소셜로그인 - 라이브러리로 자동화

CodeKong의 기술 블로그·2024년 1월 10일
2

SPRING BOOT

목록 보기
24/24
post-thumbnail

안녕하세요. 오늘은 지난 코드들을 모두 자동화시켜주는 Oauth 라이브러리를 사용해 보겠습니다!


📌 설정

지난 포스팅과 달라진 점이 있는데요, 제일 중요한 부분은 redirect-uri의 변경입니다.
해당 변경사항 관련하여 트러블 슈팅하였습니다~

spring:
	  security:
        oauth2:
          client:
            registration:
                kakao:
                    client-id: 본인 client-id
                    client-secret: 본인 client-secret
                    client-authentication-method: client_secret_post
                    #redirect-uri: http://localhost:8080/oauth2/kakao
                    redirect-uri: http://localhost:8080/login/oauth2/code/kakao
                    authorization-grant-type: authorization_code
                    client-name: kakao
                    scope:
                      - account_email

            provider:
              kakao:
                authorization-uri: https://kauth.kakao.com/oauth/authorize
                token-uri: https://kauth.kakao.com/oauth/token
                user-info-uri: https://kapi.kakao.com/v2/user/me
                user-name-attribute: id

📌 구현

그다음

kakao:
	authorization-uri: https://kauth.kakao.com/oauth/authorize
   	token-uri: https://kauth.kakao.com/oauth/token
   	user-info-uri: https://kapi.kakao.com/v2/user/me

에서 등록학 url을 통해 라이브러리가

이 모든 과정 + 회원 정보 얻어오기를 모두 해줍니다.
말 그대로 "로그인에 성공한 이후" 로직만 작성하면 되는 구조입니다!

그럼 이후 로직을 작성하기위해 Service class 구현을 해보겠습니다!

@Service
@Slf4j
public class OAuthService extends DefaultOAuth2UserService {

    @Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) {
        return null;
    }

}

먼저 DefaultOAuth2UserService 를 상속하여 loadUser를 구현해줍니다!

사용하기전 OAuth2UserRequest 객체에는 어떤 값이 있는지 디버그 해볼게요!

이전에 yml에서 설정한 값들을 통해 access token 까지 얻어온 객체입니다.

이제 DefaultOAuth2UserService의 loadUser메소드를 통해 유저 정보를 얻오오겠습니다!

@Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) {
        OAuth2User oAuth2User = super.loadUser(userRequest);
        return null;
    }

코드를 추가해주면

예상했던 email 값과 추가 정보들을 얻어 올 수 있음을 알 수 있습니다!

이제 받아온 유저 정보를 반환하면 로그인에 성공하게 됩니다.

@Override
    public OAuth2User loadUser(OAuth2UserRequest userRequest) {
        OAuth2User oAuth2User = super.loadUser(userRequest);
        return oAuth2User;
    }

❗ 이어서 추가적인 정보없을 시 회원가입, 정보를 이용한 처리 등은 각자 메서드를 작성하거나 예외처리를 해주시면 됩니다!


📌 설정 추가

이제 SecurityConfig에 설정을 추가해줄 겁니다!

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
public class SpringSecurityConfig {

    private final OAuthService oAuthService;

    @Bean
    public SecurityFilterChain filerChain(HttpSecurity http) throws Exception {
        http
                .csrf(AbstractHttpConfigurer::disable)
                .cors(AbstractHttpConfigurer::disable)

                //세션 사용하지 않음
                .sessionManagement(session -> session
                        .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                )

                //h2-console관련
                .headers(header -> header
                        .frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)
                )

                //권한 설정
                .authorizeHttpRequests(request-> request
                        .dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()
                        .requestMatchers("/api/users/**","/status/**","/h2-console/**","/auth/**","/oauth2/**").permitAll()
                        .anyRequest().authenticated()
                )

                .oauth2Login(login -> login
                        .defaultSuccessUrl("/status/ok",true)
                        .userInfoEndpoint(userInfo -> userInfo
                                .userService(oAuthService)
                        )
                );

        return http.build();
    }

    @Bean
    PasswordEncoder passwordEncoder() {
        return new SimplePaaswordEncoder();
    }

}

/status/ok은 성공 여부를 확인하기 위해 만든 간단한 컨트롤러 입니다!
본인의 필요에 맞게 설정해주면 됩니다!

이제 다시 로그인을 해주면..

🌟성공!🌟

0개의 댓글