-
Notifications
You must be signed in to change notification settings - Fork 4
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* feat: (#29) 카카오 OAuth를 통해 정보를 받아서 가입하는 기능 구현 * chore: (#29) OAuth API요청에 대한 환경변수 설정 * feat: (#29) Member의 랜덤 닉네임을 지정하기 위한 수 생성기 구현 * chore: (#29) JJWT라이브러리 의존성 추가 * feat: (#29) 로그인한 회원에 대한 정보를 JWT로 반환하는 기능 추가 * chore: (#29) 토큰 관련 환경변수 설정 추가 * refactor: (#29) ResponseDto를 record형식으로 변환 * feat: (#29) 인증정보를 확인하는 AuthenticationFilter구현 * feat: (#29) 멤버가 존재하는지 확인한 후 반환하는 ArgumentResolver구현 * test: (#29) loginWithKakao메서드에 대한 컨트롤러 단위 테스트 작성 * refactor: (#29) Member엔티티 필드명 수정 및 추가 * test: (#29) Member 등록에 대한 검증 추가 * chore: (#29) test를 위한 yaml파일을 추가하여 환경 분리 * refactor: (#29) conflict 해결 * refactor: (#29) Controller Swagger를 위한 어노테이션 추가 * feat: (#29) CORS설정 및 ArgumentResolver등록 * chore: (#29) test환경 환경변수만 존재하도록 수정 * refactor: (#29) 네이밍, 상수화, 위치변경 등의 작업 수행 * fix: (#29) 멤버의 이름에 포함되는 숫자가 고정되는 문제 해결 * refactor: (#29) ObjectMapper Bean으로 등록 * refactor: (#29) 매직넘버 상수화 및 변수, 메서드명 수정 * refactor: (#29) @JsonProperty를 @JsonNaming으로 변경 * chore: (#29) test용 production url 수정 * refactor: (#29) 상수 및 변수명 수정 * test: (#29) 토큰에 대한 검증 추가 * refactor: (#29) 토큰을 파싱할 때 유효성 검사 추가 * refactor: (#29) 로그인 api nickname 필드 추가 * refactor: (#29) 토큰 검증 DisplayName 변경 * refactor: (#29) Swagger tag name 변경 * refactor: (#29) TokenProcessorTest의 필드를 빈을 사용하도록 변경
- Loading branch information
Showing
35 changed files
with
826 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,9 +1,18 @@ | ||
package com.votogether.config; | ||
|
||
import com.fasterxml.jackson.databind.ObjectMapper; | ||
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; | ||
import org.springframework.context.annotation.Bean; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.data.jpa.repository.config.EnableJpaAuditing; | ||
|
||
@Configuration | ||
@EnableJpaAuditing | ||
public class JpaConfig { | ||
|
||
@Bean | ||
public ObjectMapper objectMapper() { | ||
return new ObjectMapper().registerModule(new JavaTimeModule()); | ||
} | ||
|
||
} |
46 changes: 46 additions & 0 deletions
46
backend/src/main/java/com/votogether/config/WebMvcConfig.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
package com.votogether.config; | ||
|
||
import com.votogether.global.jwt.JwtAuthorizationArgumentResolver; | ||
import java.util.List; | ||
import org.springframework.beans.factory.annotation.Value; | ||
import org.springframework.context.annotation.Configuration; | ||
import org.springframework.http.HttpHeaders; | ||
import org.springframework.http.HttpMethod; | ||
import org.springframework.web.method.support.HandlerMethodArgumentResolver; | ||
import org.springframework.web.servlet.config.annotation.CorsRegistry; | ||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||
|
||
@Configuration | ||
public class WebMvcConfig implements WebMvcConfigurer { | ||
|
||
private final JwtAuthorizationArgumentResolver jwtAuthorizationArgumentResolver; | ||
private final String origins; | ||
|
||
public WebMvcConfig( | ||
final JwtAuthorizationArgumentResolver jwtAuthorizationArgumentResolver, | ||
@Value("${votogether.openapi.prod-url}") final String origins | ||
) { | ||
this.jwtAuthorizationArgumentResolver = jwtAuthorizationArgumentResolver; | ||
this.origins = origins; | ||
} | ||
|
||
@Override | ||
public void addArgumentResolvers(final List<HandlerMethodArgumentResolver> resolvers) { | ||
resolvers.add(jwtAuthorizationArgumentResolver); | ||
} | ||
|
||
@Override | ||
public void addCorsMappings(final CorsRegistry registry) { | ||
registry.addMapping("/**") | ||
.allowedHeaders("*") | ||
.allowedOrigins(origins) | ||
.allowedMethods( | ||
HttpMethod.POST.name(), | ||
HttpMethod.GET.name(), | ||
HttpMethod.PATCH.name(), | ||
HttpMethod.PUT.name(), | ||
HttpMethod.DELETE.name() | ||
) | ||
.exposedHeaders(HttpHeaders.LOCATION); | ||
} | ||
} |
33 changes: 33 additions & 0 deletions
33
backend/src/main/java/com/votogether/domain/auth/controller/AuthController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
package com.votogether.domain.auth.controller; | ||
|
||
import com.votogether.domain.auth.dto.LoginResponse; | ||
import com.votogether.domain.auth.service.AuthService; | ||
import io.swagger.v3.oas.annotations.Operation; | ||
import io.swagger.v3.oas.annotations.responses.ApiResponse; | ||
import io.swagger.v3.oas.annotations.responses.ApiResponses; | ||
import io.swagger.v3.oas.annotations.tags.Tag; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.http.ResponseEntity; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.RequestParam; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
@Tag(name = "회원 인증", description = "회원 인증 API") | ||
@RequiredArgsConstructor | ||
@RestController | ||
public class AuthController { | ||
|
||
private final AuthService authService; | ||
|
||
@Operation(summary = "카카오 로그인 하기", description = "카카오 계정으로 로그인을 한다.") | ||
@ApiResponses({ | ||
@ApiResponse(responseCode = "200", description = "카카오 로그인 성공"), | ||
@ApiResponse(responseCode = "400", description = "올바르지 않은 요청"), | ||
@ApiResponse(responseCode = "401", description = "올바르지 않은 인증코드") | ||
}) | ||
@GetMapping("/auth/kakao/callback") | ||
public ResponseEntity<LoginResponse> loginByKakao(@RequestParam final String code) { | ||
return ResponseEntity.ok(authService.register(code)); | ||
} | ||
|
||
} |
21 changes: 21 additions & 0 deletions
21
backend/src/main/java/com/votogether/domain/auth/dto/KakaoMemberResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
package com.votogether.domain.auth.dto; | ||
|
||
import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||
import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||
|
||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record KakaoMemberResponse( | ||
Long id, | ||
KakaoAccount kakaoAccount | ||
) { | ||
|
||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record KakaoAccount( | ||
String email, | ||
String ageRange, | ||
String birthday, | ||
String gender | ||
) { | ||
} | ||
|
||
} |
7 changes: 7 additions & 0 deletions
7
backend/src/main/java/com/votogether/domain/auth/dto/LoginResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package com.votogether.domain.auth.dto; | ||
|
||
public record LoginResponse( | ||
String accessToken, | ||
String nickname | ||
) { | ||
} |
14 changes: 14 additions & 0 deletions
14
backend/src/main/java/com/votogether/domain/auth/dto/OAuthAccessTokenResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
package com.votogether.domain.auth.dto; | ||
|
||
import com.fasterxml.jackson.databind.PropertyNamingStrategies; | ||
import com.fasterxml.jackson.databind.annotation.JsonNaming; | ||
|
||
@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class) | ||
public record OAuthAccessTokenResponse( | ||
String tokenType, | ||
String accessToken, | ||
Integer expiresIn, | ||
String refreshToken, | ||
Integer refreshTokenExpiresIn | ||
) { | ||
} |
31 changes: 31 additions & 0 deletions
31
backend/src/main/java/com/votogether/domain/auth/service/AuthService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.votogether.domain.auth.service; | ||
|
||
import com.votogether.domain.auth.dto.KakaoMemberResponse; | ||
import com.votogether.domain.auth.dto.LoginResponse; | ||
import com.votogether.domain.member.entity.Member; | ||
import com.votogether.domain.member.service.MemberService; | ||
import com.votogether.global.jwt.TokenProcessor; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@RequiredArgsConstructor | ||
@Service | ||
public class AuthService { | ||
|
||
private final KakaoOAuthClient kakaoOAuthClient; | ||
private final MemberService memberService; | ||
private final TokenProcessor tokenProcessor; | ||
|
||
@Transactional | ||
public LoginResponse register(final String code) { | ||
final String accessToken = kakaoOAuthClient.getAccessToken(code); | ||
final KakaoMemberResponse response = kakaoOAuthClient.getMemberInfo(accessToken); | ||
|
||
final Member member = Member.from(response); | ||
final Member registeredMember = memberService.register(member); | ||
final String token = tokenProcessor.generateToken(registeredMember); | ||
return new LoginResponse(token, member.getNickname()); | ||
} | ||
|
||
} |
52 changes: 52 additions & 0 deletions
52
backend/src/main/java/com/votogether/domain/auth/service/KakaoOAuthClient.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,52 @@ | ||
package com.votogether.domain.auth.service; | ||
|
||
import com.votogether.domain.auth.dto.KakaoMemberResponse; | ||
import com.votogether.domain.auth.dto.OAuthAccessTokenResponse; | ||
import lombok.Getter; | ||
import org.springframework.boot.context.properties.ConfigurationProperties; | ||
import org.springframework.http.HttpEntity; | ||
import org.springframework.http.HttpHeaders; | ||
import org.springframework.http.HttpMethod; | ||
import org.springframework.http.MediaType; | ||
import org.springframework.stereotype.Component; | ||
import org.springframework.util.LinkedMultiValueMap; | ||
import org.springframework.util.MultiValueMap; | ||
import org.springframework.web.client.RestTemplate; | ||
|
||
@Getter | ||
@ConfigurationProperties(prefix = "oauth.kakao") | ||
@Component | ||
public class KakaoOAuthClient { | ||
|
||
private static final RestTemplate restTemplate = new RestTemplate(); | ||
|
||
private final MultiValueMap<String, String> info = new LinkedMultiValueMap<>(); | ||
|
||
public String getAccessToken(final String code) { | ||
info.add("code", code); | ||
|
||
final OAuthAccessTokenResponse response = restTemplate.postForObject( | ||
"https://kauth.kakao.com/oauth/token", | ||
info, | ||
OAuthAccessTokenResponse.class | ||
); | ||
return response.accessToken(); | ||
} | ||
|
||
public KakaoMemberResponse getMemberInfo(final String accessToken) { | ||
final HttpHeaders headers = new HttpHeaders(); | ||
headers.setBearerAuth(accessToken); | ||
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); | ||
|
||
final HttpEntity<Void> request = new HttpEntity<>(headers); | ||
|
||
final KakaoMemberResponse response = restTemplate.exchange( | ||
"https://kapi.kakao.com/v2/user/me", | ||
HttpMethod.GET, | ||
request, | ||
KakaoMemberResponse.class | ||
).getBody(); | ||
return response; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 12 additions & 0 deletions
12
backend/src/main/java/com/votogether/domain/member/entity/NicknameNumberGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.votogether.domain.member.entity; | ||
|
||
public class NicknameNumberGenerator implements NumberGenerator { | ||
|
||
private static int number = 0; | ||
|
||
@Override | ||
public int generate() { | ||
return ++number; | ||
} | ||
|
||
} |
7 changes: 7 additions & 0 deletions
7
backend/src/main/java/com/votogether/domain/member/entity/NumberGenerator.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package com.votogether.domain.member.entity; | ||
|
||
public interface NumberGenerator { | ||
|
||
int generate(); | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,7 +2,7 @@ | |
|
||
public enum SocialType { | ||
|
||
GOOGLE, | ||
KAKAO, | ||
; | ||
|
||
} |
5 changes: 5 additions & 0 deletions
5
backend/src/main/java/com/votogether/domain/member/repository/MemberRepository.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,12 @@ | ||
package com.votogether.domain.member.repository; | ||
|
||
import com.votogether.domain.member.entity.Member; | ||
import com.votogether.domain.member.entity.SocialType; | ||
import java.util.Optional; | ||
import org.springframework.data.jpa.repository.JpaRepository; | ||
|
||
public interface MemberRepository extends JpaRepository<Member, Long> { | ||
|
||
Optional<Member> findBySocialIdAndSocialType(final String socialId, final SocialType socialType); | ||
|
||
} |
31 changes: 31 additions & 0 deletions
31
backend/src/main/java/com/votogether/domain/member/service/MemberService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,31 @@ | ||
package com.votogether.domain.member.service; | ||
|
||
import com.votogether.domain.member.entity.Member; | ||
import com.votogether.domain.member.repository.MemberRepository; | ||
import java.util.Optional; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@RequiredArgsConstructor | ||
@Service | ||
public class MemberService { | ||
|
||
private final MemberRepository memberRepository; | ||
|
||
@Transactional | ||
public Member register(final Member member) { | ||
final Optional<Member> maybeMember = memberRepository.findBySocialIdAndSocialType( | ||
member.getSocialId(), | ||
member.getSocialType() | ||
); | ||
return maybeMember.orElseGet(() -> memberRepository.save(member)); | ||
} | ||
|
||
@Transactional(readOnly = true) | ||
public Member findById(final Long memberId) { | ||
return memberRepository.findById(memberId) | ||
.orElseThrow(() -> new IllegalArgumentException("해당 Id를 가진 회원은 존재하지 않습니다.")); | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
package com.votogether.global.jwt; | ||
|
||
import java.lang.annotation.ElementType; | ||
import java.lang.annotation.Retention; | ||
import java.lang.annotation.RetentionPolicy; | ||
import java.lang.annotation.Target; | ||
|
||
@Target(ElementType.PARAMETER) | ||
@Retention(RetentionPolicy.RUNTIME) | ||
public @interface Auth { | ||
} |
Oops, something went wrong.