Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

회원가입 및 로그인 & 인가 기능 구현 #82

Merged
merged 32 commits into from
Jul 20, 2023
Merged
Changes from 1 commit
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
076d96d
feat: (#29) 카카오 OAuth를 통해 정보를 받아서 가입하는 기능 구현
jeomxon Jul 14, 2023
f3ac5d1
chore: (#29) OAuth API요청에 대한 환경변수 설정
jeomxon Jul 14, 2023
0b5e2ed
feat: (#29) Member의 랜덤 닉네임을 지정하기 위한 수 생성기 구현
jeomxon Jul 14, 2023
aa19fd6
chore: (#29) JJWT라이브러리 의존성 추가
jeomxon Jul 16, 2023
0335db6
feat: (#29) 로그인한 회원에 대한 정보를 JWT로 반환하는 기능 추가
jeomxon Jul 16, 2023
6391141
chore: (#29) 토큰 관련 환경변수 설정 추가
jeomxon Jul 16, 2023
147bad7
refactor: (#29) ResponseDto를 record형식으로 변환
jeomxon Jul 16, 2023
149f1ed
feat: (#29) 인증정보를 확인하는 AuthenticationFilter구현
jeomxon Jul 17, 2023
b4015f7
feat: (#29) 멤버가 존재하는지 확인한 후 반환하는 ArgumentResolver구현
jeomxon Jul 18, 2023
b9f6d3e
test: (#29) loginWithKakao메서드에 대한 컨트롤러 단위 테스트 작성
jeomxon Jul 18, 2023
326f668
refactor: (#29) Member엔티티 필드명 수정 및 추가
jeomxon Jul 18, 2023
37b54f0
test: (#29) Member 등록에 대한 검증 추가
jeomxon Jul 18, 2023
861a836
chore: (#29) test를 위한 yaml파일을 추가하여 환경 분리
jeomxon Jul 19, 2023
7f6a981
Merge branch 'dev' into feat/#29
jeomxon Jul 19, 2023
c856828
refactor: (#29) conflict 해결
jeomxon Jul 19, 2023
435348b
refactor: (#29) Controller Swagger를 위한 어노테이션 추가
jeomxon Jul 19, 2023
fd4730e
feat: (#29) CORS설정 및 ArgumentResolver등록
jeomxon Jul 19, 2023
9361516
chore: (#29) test환경 환경변수만 존재하도록 수정
jeomxon Jul 19, 2023
45ef172
refactor: (#29) 네이밍, 상수화, 위치변경 등의 작업 수행
jeomxon Jul 19, 2023
3f4a538
fix: (#29) 멤버의 이름에 포함되는 숫자가 고정되는 문제 해결
jeomxon Jul 19, 2023
b26ea29
refactor: (#29) ObjectMapper Bean으로 등록
jeomxon Jul 19, 2023
33d2a2b
refactor: (#29) 매직넘버 상수화 및 변수, 메서드명 수정
jeomxon Jul 19, 2023
6efed21
refactor: (#29) @JsonProperty를 @JsonNaming으로 변경
jeomxon Jul 19, 2023
1e6ab82
chore: (#29) test용 production url 수정
jeomxon Jul 20, 2023
085d37b
refactor: (#29) 상수 및 변수명 수정
jeomxon Jul 20, 2023
b3e2d2d
test: (#29) 토큰에 대한 검증 추가
jeomxon Jul 20, 2023
d0553ba
refactor: (#29) 토큰을 파싱할 때 유효성 검사 추가
jeomxon Jul 20, 2023
059534a
merge: (#29) conflict 해결
jeomxon Jul 20, 2023
bbac2a0
refactor: (#29) 로그인 api nickname 필드 추가
jeomxon Jul 20, 2023
dc3e480
refactor: (#29) 토큰 검증 DisplayName 변경
jeomxon Jul 20, 2023
62605a7
refactor: (#29) Swagger tag name 변경
jeomxon Jul 20, 2023
c35ae22
refactor: (#29) TokenProcessorTest의 필드를 빈을 사용하도록 변경
jeomxon Jul 20, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
package com.votogether.global.jwt;

import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.votogether.domain.RepositoryTest;
import com.votogether.domain.member.entity.Gender;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.member.entity.SocialType;
import com.votogether.domain.member.repository.MemberRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
import org.springframework.beans.factory.annotation.Autowired;

@RepositoryTest
class TokenProcessorTest {

@Autowired
private MemberRepository memberRepository;

private TokenProcessor tokenProcessor;
private ObjectMapper objectMapper;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 : @RepositoryTest는 JpaConfig를 import하고 있으므로 빈으로 등록된 ObjectMapper를 사용해도 괜찮지 않을까요?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제가 등록해놓고도 인지를 못하고 있었네요...ㅎㅎ
수정하겠습니다!


@BeforeEach
void setUp() {
objectMapper = new ObjectMapper();
String secretKey = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd";
int expirationTime = 100000;
tokenProcessor = new TokenProcessor(
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P3 : 동일한 TokenProcessor를 생성하는 동작으로 이해했습니다! 테스트마다 초기화해주는 이유가 있을까요 🤔

Copy link
Collaborator Author

@jeomxon jeomxon Jul 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좀 더 효과적인 방법으로 리팩터링 진행했습니다!
인지하지 못하고 있었네요. 덕분에 배워갑니다 :)

secretKey,
expirationTime,
objectMapper
);
}

@Test
@DisplayName("토큰을 생성한다.")
void generateToken() throws Exception {
// given
Member member = Member.builder()
.nickname("저문")
.gender(Gender.MALE)
.ageRange("20~29")
.birthday("0101")
.socialType(SocialType.KAKAO)
.socialId("123123")
.point(0)
.build();

memberRepository.save(member);

// when
String token = tokenProcessor.generateToken(member);

// then
TokenPayload tokenPayload = tokenProcessor.parseToken(token);
assertThat(tokenPayload.memberId()).isEqualTo(member.getId());
}

@Nested
class ResolveToken {

@Test
@DisplayName("토큰의 prefix를 제외한 값을 추출한다.")
void resolveTokenSuccess() throws JsonProcessingException {
// given
Member member = Member.builder()
.nickname("저문")
.gender(Gender.MALE)
.ageRange("20~29")
.birthday("0101")
.socialType(SocialType.KAKAO)
.socialId("123123")
.point(0)
.build();
memberRepository.save(member);

String token = tokenProcessor.generateToken(member);
token = "Bearer " + token;

// when
String resolvedToken = tokenProcessor.resolveToken(token);

// then
TokenPayload tokenPayload = tokenProcessor.parseToken(resolvedToken);
assertThat(tokenPayload.memberId()).isEqualTo(member.getId());
}

@ParameterizedTest
@ValueSource(strings = {"Bear", "Barrier", "Baerer", "bearer"})
@DisplayName("토큰의 prefix를 제외한 값을 추출한다.")
void resolveTokenFail(String prefix) {
Copy link
Collaborator

@aiaiaiai1 aiaiaiai1 Jul 20, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 : @DisplayName이 전의 테스트랑 복붙이 된거같아요

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

올리자마자 확인해서 수정했습니다! ㅎㅎ

// given
Member member = Member.builder()
.nickname("저문")
.gender(Gender.MALE)
.ageRange("20~29")
.birthday("0101")
.socialType(SocialType.KAKAO)
.socialId("123123")
.point(0)
.build();
memberRepository.save(member);

String token = prefix + tokenProcessor.generateToken(member);

// when, then
assertThatThrownBy(() -> tokenProcessor.resolveToken(token))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("올바르지 않은 토큰입니다.");
}

}

}