티스토리 뷰
스프링/스프링부트 RestAPI 프로젝트
spring boot REST API Web 프로젝트 (12 - 4) - OAuth 2.0 카카오 로그인 테스트 검증
구름뭉치 2021. 9. 2. 18:38스프링 부트 REST API WEB 프로젝트
깃헙 링크
https://github.com/choiwoonsik/springboot_RestApi_App_Project/tree/main/restApiSpringBootApp
수행 목록
- 환경구성 및 helloworld 출력
- H2 DB 연동
- Swagger API 문서 연동
- REST API 설계
- RestControllerAdvice를 이용한 통합 예외 처리
- Entity - DTO 분리
- MessageSource를 이용해 예외 메시지 다국화
- JPA Aduting을 이용해 객체 생성시간/수정시간 적용
- 스프링 시큐리티 + Jwt를 이용해서 인증 및 권한 체크
- 스프링 시큐리티 AuthenticationEntryPoint, AccessDenied로 인증 및 인가 예외처리
- Jwt AccessToken + RefreshToken으로 보안성과 사용자 편의성 고도화하기
- JUnit Test (단위 테스트)
- JUnit Test (통합 테스트)
- OAuth 2.0 정리
- OAuth 2.0 카카오 로그인 part.1 Authorization code + Token 발급
- OAuth 2.0 카카오 로그인 part.2 토큰으로 회원 가입 / 로그인
- OAuth 2.0 카카오 로그인 테스트 검증
- 환경별 설정을 위해서profile 분리하기
테스트 코드를 작성
- 카카오 로그인 테스트 과정 중에서 인가코드를 발급받는 부분은 테스트 구현을 어떻게 해야될지 모르겠어서 제외하고 작성한다.
- 해당 부분을 테스트하려면 요청 url을 보내고 뜬 화면에서 [카카오 로그인]버튼을 클릭하고 생성된 [카카오 로그인 창]에서 진행해야 리다이렉트 되는 [인가 코드]를 발급받고 해당 코드로 [토큰]까지 테스트할 수 있는데 그부분을 못하겠어서 제외한다.
1. 카카오 회원가입 / 로그인 테스트
세팅
@Autowired
private MockMvc mockMvc;
@Autowired
private ObjectMapper objectMapper;
@Autowired
private UserJpaRepo userJpaRepo;
@Autowired
PasswordEncoder passwordEncoder;
private static final String accessToken = "cLDCR4xs1TYyrJAIzQ9bzvXuzML37QiimPVuEwo9dVoAAAF7dvoLNw";
카카오 회원가입 성공
@Test
public void 카카오_회원가입_성공() throws Exception {
//given
String object = objectMapper.writeValueAsString(UserSocialSignupRequestDto.builder()
.accessToken(accessToken)
.build());
//when
ResultActions actions = mockMvc.perform(
post("/v1/social/signup/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(object)
);
//then
actions
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.code").value(0));
}
카카오 회원가입 토큰 에러로 실패
@Test
public void 카카오_회원가입_토큰에러_실패() throws Exception
{
//given
String object = objectMapper.writeValueAsString(UserSocialSignupRequestDto.builder()
.accessToken(accessToken+"_wrongToken")
.build());
//when
ResultActions actions = mockMvc.perform(
post("/v1/social/signup/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(object));
//then
actions.andDo(print())
.andExpect(status().is4xxClientError())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.code").value("-1007"));
}
카카오 회원가입 기가입 유저로 실패
@Test
public void 카카오_회원가입_기가입_유저_실패() throws Exception
{
//given
userJpaRepo.save(User.builder()
.nickName("woonsik")
.name("woonsik")
.email("groom@kakao.com")
.provider("kakao")
.build());
String object = objectMapper.writeValueAsString(UserSocialSignupRequestDto.builder()
.accessToken(accessToken)
.build());
//when
ResultActions actions = mockMvc.perform(post("/v1/social/signup/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(object));
//then
actions
.andDo(print())
.andExpect(status().is4xxClientError())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.code").value("-1008"));
}
카카오 로그인 성공
@Test
public void 카카오_로그인_성공() throws Exception
{
//given
String object = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
.accessToken(accessToken)
.build());
//when
mockMvc.perform(post("/v1/social/signup/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(object));
ResultActions actions = mockMvc.perform(post("/v1/social/login/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(object));
//then
actions
.andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$.success").value(true))
.andExpect(jsonPath("$.code").value(0));
}
카카오 로그인 토큰에러로 실패
@Test
public void 카카오_로그인_액세스토큰오류_실패() throws Exception
{
//given
String signUpObject = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
.accessToken(accessToken)
.build());
String logInObject = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
.accessToken(accessToken+"_wrongToken")
.build());
//when
mockMvc.perform(post("/v1/social/signup/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(signUpObject));
ResultActions actions = mockMvc.perform(post("/v1/social/login/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(logInObject));
//then
actions
.andDo(print())
.andExpect(status().is4xxClientError())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.code").value(-1007));
}
카카오 로그인 미가입 유저로 실패
@Test
public void 카카오_로그인_비가입자_실패() throws Exception
{
//given
String logInObject = objectMapper.writeValueAsString(UserSocialLoginRequestDto.builder()
.accessToken(accessToken)
.build());
//when
ResultActions actions = mockMvc.perform(post("/v1/social/login/kakao")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.content(logInObject));
//then
actions
.andDo(print())
.andExpect(status().is4xxClientError())
.andExpect(jsonPath("$.success").value(false))
.andExpect(jsonPath("$.code").value(-1000));
}
2. 액세스 토큰으로 카카오 정보 가져오기 테스트
@RunWith(SpringRunner.class)
@SpringBootTest
@WithMockUser(username = "mockUser")
public class KakaoServiceTest {
@Autowired
private KakaoService kakaoService;
private static final String accessToken = "cLDCR4xs1TYyrJAIzQ9bzvXuzML37QiimPVuEwo9dVoAAAF7dvoLNw";
@Test
public void 액세스토큰으로_사용자정보_요청() throws Exception
{
//given
//when
KakaoProfile kakaoProfile = kakaoService.getKakaoProfile(accessToken);
//then
assertThat(kakaoProfile).isNotNull();
assertThat(kakaoProfile.getKakao_account().getEmail()).isEqualTo("groom@kakao.com");
assertThat(kakaoProfile.getProperties().getNickname()).isEqualTo("최운식");
}
}
3. 카카오 회원 조회 테스트
이메일 + 제공자로 조회
@Test
public void 카카오_가입자_조회() throws Exception
{
//given
userJpaRepo.save(User.builder()
.name(name)
.email(email)
.nickName(name)
.provider("kakao")
.build());
//when
Optional<User> kakao = userJpaRepo.findByEmailAndProvider(email, "kakao");
//then
assertThat(kakao).isNotNull();
assertThat(kakao.isPresent()).isEqualTo(true);
assertThat(kakao.get().getName()).isEqualTo(name);
assertThat(kakao.get().getProvider()).isEqualTo("kakao");
}
테스트까지 진행하면서 OAuth 2.0 Kakao API로 회원가입 / 로그인 기능 구현 및 검증을 진행해보았다.
반응형
'스프링 > 스프링부트 RestAPI 프로젝트' 카테고리의 다른 글
Comments
반응형
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday