지난 포스팅과 달라진 점이 있는데요, 제일 중요한 부분은 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
@Slf4j
public class OAuthService extends DefaultOAuth2UserService {
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) {
return null;
}
}
먼저 DefaultOAuth2UserService 를 상속하여 loadUser를 구현해줍니다!
이전에 yml에서 설정한 값들을 통해 access token 까지 얻어온 객체입니다.
@Override
public OAuth2User loadUser(OAuth2UserRequest userRequest) {
OAuth2User oAuth2User = super.loadUser(userRequest);
return null;
}
코드를 추가해주면
이제 받아온 유저 정보를 반환하면 로그인에 성공하게 됩니다.
@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은 성공 여부를 확인하기 위해 만든 간단한 컨트롤러 입니다!
본인의 필요에 맞게 설정해주면 됩니다!
이제 다시 로그인을 해주면..