From 8ef79818488e82a778b3baf28d570be4ae2ad9a6 Mon Sep 17 00:00:00 2001 From: dayeong Date: Tue, 17 Sep 2024 21:15:17 +0900 Subject: [PATCH 1/3] =?UTF-8?q?#90=20Refactor:=20TokenController=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drinkeg/controller/MemberController.java | 8 ------- .../drinkeg/controller/TokenController.java | 23 +++++++++++++++++++ 2 files changed, 23 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/drinkeg/drinkeg/controller/TokenController.java diff --git a/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java b/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java index 2f24bc40..14229bf5 100644 --- a/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java +++ b/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java @@ -29,9 +29,7 @@ public class MemberController { private final JoinService joinService; - private final TokenService tokenService; private final AppleLoginService appleLoginService; - private final JWTUtil jwtUtil; @PostMapping("/join") public ApiResponse joinProcess(@RequestBody JoinDTO joinDTO) { @@ -40,12 +38,6 @@ public ApiResponse joinProcess(@RequestBody JoinDTO joinDTO) { return ApiResponse.onSuccess("회원가입 성공"); } - @PostMapping("/reissue") - public ApiResponse reissue(HttpServletRequest request, HttpServletResponse response) { - - tokenService.reissueRefreshToken(request, response); - return ApiResponse.onSuccess("토큰 재발급 성공"); - } @PatchMapping("/member") public ApiResponse addMemberDetail(@RequestBody MemberRequestDTO memberRequestDTO, @AuthenticationPrincipal PrincipalDetail principalDetail) { diff --git a/src/main/java/com/drinkeg/drinkeg/controller/TokenController.java b/src/main/java/com/drinkeg/drinkeg/controller/TokenController.java new file mode 100644 index 00000000..517b9999 --- /dev/null +++ b/src/main/java/com/drinkeg/drinkeg/controller/TokenController.java @@ -0,0 +1,23 @@ +package com.drinkeg.drinkeg.controller; + +import com.drinkeg.drinkeg.apipayLoad.ApiResponse; +import com.drinkeg.drinkeg.service.loginService.TokenService; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RestController; + + +@RestController +@RequiredArgsConstructor +public class TokenController { + + private final TokenService tokenService; + @PostMapping("/reissue") + public ApiResponse reissue(HttpServletRequest request, HttpServletResponse response) { + + tokenService.reissueRefreshToken(request, response); + return ApiResponse.onSuccess("토큰 재발급 성공"); + } +} From aefc07ccffb1ebe723f671c9f6a39617f81e24e4 Mon Sep 17 00:00:00 2001 From: dayeong Date: Tue, 17 Sep 2024 22:01:05 +0900 Subject: [PATCH 2/3] =?UTF-8?q?#89=20Refactor:=201.=20OAuth2=20controller?= =?UTF-8?q?=20=EC=83=9D=EC=84=B1=202.=20memberConverter=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../drinkeg/controller/MemberController.java | 13 -------- .../drinkeg/controller/OAuth2Controller.java | 33 +++++++++++++++++++ .../drinkeg/converter/MemberConverter.java | 21 ++++++++++++ .../loginService/AppleLoginService.java | 10 +++--- 4 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/drinkeg/drinkeg/controller/OAuth2Controller.java create mode 100644 src/main/java/com/drinkeg/drinkeg/converter/MemberConverter.java diff --git a/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java b/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java index 14229bf5..fe6819ab 100644 --- a/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java +++ b/src/main/java/com/drinkeg/drinkeg/controller/MemberController.java @@ -29,7 +29,6 @@ public class MemberController { private final JoinService joinService; - private final AppleLoginService appleLoginService; @PostMapping("/join") public ApiResponse joinProcess(@RequestBody JoinDTO joinDTO) { @@ -44,18 +43,6 @@ public ApiResponse addMemberDetail(@RequestBody MemberRequest return ApiResponse.onSuccess(joinService.addMemberDetail(memberRequestDTO, principalDetail.getUsername())); } - @PostMapping("/login/apple") - public ApiResponse appleLogin(@RequestBody AppleLoginRequestDTO appleLoginRequestDTO,HttpServletResponse response) throws Exception{ - - System.out.println("=========start apple login controller============"); - - if(appleLoginRequestDTO.getIdentityToken() == null){ - throw new TempHandler(ErrorStatus.IDENTITY_TOKEN_NOT_FOUND); - } - - return ApiResponse.onSuccess(appleLoginService.appleLogin(appleLoginRequestDTO, response)); - } - } diff --git a/src/main/java/com/drinkeg/drinkeg/controller/OAuth2Controller.java b/src/main/java/com/drinkeg/drinkeg/controller/OAuth2Controller.java new file mode 100644 index 00000000..3b67de11 --- /dev/null +++ b/src/main/java/com/drinkeg/drinkeg/controller/OAuth2Controller.java @@ -0,0 +1,33 @@ +package com.drinkeg.drinkeg.controller; + +import com.drinkeg.drinkeg.apipayLoad.ApiResponse; +import com.drinkeg.drinkeg.apipayLoad.code.status.ErrorStatus; +import com.drinkeg.drinkeg.apipayLoad.handler.TempHandler; +import com.drinkeg.drinkeg.dto.AppleLoginDTO.AppleLoginRequestDTO; +import com.drinkeg.drinkeg.dto.loginDTO.oauth2DTO.LoginResponse; +import com.drinkeg.drinkeg.exception.GeneralException; +import com.drinkeg.drinkeg.service.loginService.AppleLoginService; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Optional; + +@RestController +@RequiredArgsConstructor +public class OAuth2Controller { + + private final AppleLoginService appleLoginService; + @PostMapping("/login/apple") + public ApiResponse appleLogin(@RequestBody AppleLoginRequestDTO appleLoginRequestDTO, HttpServletResponse response) throws Exception{ + + System.out.println("=========start apple login controller============"); + + Optional.ofNullable(appleLoginRequestDTO.getIdentityToken()) + .orElseThrow(() -> new GeneralException(ErrorStatus.IDENTITY_TOKEN_NOT_FOUND)); + + return ApiResponse.onSuccess(appleLoginService.appleLogin(appleLoginRequestDTO, response)); + } +} diff --git a/src/main/java/com/drinkeg/drinkeg/converter/MemberConverter.java b/src/main/java/com/drinkeg/drinkeg/converter/MemberConverter.java new file mode 100644 index 00000000..6f29ffa5 --- /dev/null +++ b/src/main/java/com/drinkeg/drinkeg/converter/MemberConverter.java @@ -0,0 +1,21 @@ +package com.drinkeg.drinkeg.converter; + +import com.drinkeg.drinkeg.domain.Member; +import org.springframework.stereotype.Component; + +import java.util.Map; + + +@Component +public class MemberConverter { + + public Member toMember(String username, Map claims) { + return Member.builder() + .username(username) + .email((String) claims.get("email")) // email 값을 claims에서 추출 + .role("ROLE_USER") + .isFirst(true) + .build(); + + } +} diff --git a/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java b/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java index d0b04839..0a4ca6f3 100644 --- a/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java +++ b/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java @@ -1,5 +1,6 @@ package com.drinkeg.drinkeg.service.loginService; +import com.drinkeg.drinkeg.converter.MemberConverter; import com.drinkeg.drinkeg.domain.Member; import com.drinkeg.drinkeg.dto.AppleLoginDTO.AppleLoginRequestDTO; import com.drinkeg.drinkeg.dto.loginDTO.oauth2DTO.LoginResponse; @@ -35,12 +36,14 @@ public class AppleLoginService { private final MemberRepository memberRepository; private final RedisClient redisClient; private final JWTUtil jwtUtil; + private final MemberConverter memberConverter; public LoginResponse appleLogin(AppleLoginRequestDTO appleLoginRequestDTO, HttpServletResponse response)throws AuthenticationException, NoSuchAlgorithmException, InvalidKeySpecException, JsonProcessingException { System.out.println("--------------apple Login Start---------------"); + String identityToken = appleLoginRequestDTO.getIdentityToken(); // identity Token에서 헤더 추출 @@ -60,12 +63,7 @@ public LoginResponse appleLogin(AppleLoginRequestDTO appleLoginRequestDTO, HttpS if (existData.isEmpty()){ - Member member = Member.builder() - .username(username) - .email(claims.get("email", String.class)) - .role("ROLE_USER") - .isFirst(true) - .build(); + Member member = memberConverter.toMember(username, claims); memberRepository.save(member); System.out.println("첫 로그인임"); From da7a81963e183918ea5e021b84a76ff9926acaf2 Mon Sep 17 00:00:00 2001 From: dayeong Date: Wed, 18 Sep 2024 00:15:43 +0900 Subject: [PATCH 3/3] =?UTF-8?q?#89=20Refactor:=20appleLoginService=20?= =?UTF-8?q?=EA=B0=80=EB=8F=85=EC=84=B1=20=EC=A6=9D=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../loginService/AppleLoginService.java | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java b/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java index 0a4ca6f3..452ad001 100644 --- a/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java +++ b/src/main/java/com/drinkeg/drinkeg/service/loginService/AppleLoginService.java @@ -43,56 +43,34 @@ public LoginResponse appleLogin(AppleLoginRequestDTO appleLoginRequestDTO, HttpS System.out.println("--------------apple Login Start---------------"); - String identityToken = appleLoginRequestDTO.getIdentityToken(); - - // identity Token에서 헤더 추출 - final Map appleTokenHeader = tokenService.parseHeaders(appleLoginRequestDTO.getIdentityToken()); - - // 애플 서버에서 publicKey 받아온 후에 identity 토큰의 헤더와 일치하는 publicKey 만들기 - PublicKey publicKey = applePublicKeyGenerator.generatePublicKey(appleTokenHeader, - appleAuthClient.getAppleAuthPublicKey()); - - // identity Token에서 claims 추출 - Claims claims = tokenService.getTokenClaims(identityToken, publicKey); + Claims claims = getClaimsFromIdentityToken(identityToken); // 회원 가입 된 사용자인지 확인하기 String username = "apple "+ claims.getSubject(); Optional existData = memberRepository.findByUsername(username); + Member member; if (existData.isEmpty()){ - Member member = memberConverter.toMember(username, claims); + member = memberConverter.toMember(username, claims); memberRepository.save(member); - System.out.println("첫 로그인임"); - jwtProvider(member, response); - return LoginResponse.builder() - .username(username) - .role(member.getRole()) - .isFirst(member.getIsFirst()) - .build(); - } else{ - Member member = existData.get(); + member = existData.get(); member.updateEmail(claims.get("email", String.class)); - System.out.println("첫 로그인아님"); memberRepository.save(member); - jwtProvider(member, response); - return LoginResponse.builder() - .username(username) - .role(member.getRole()) - .isFirst(member.getIsFirst()) - .build(); } + + return buildLoginResponse(member); } public void jwtProvider(Member member, HttpServletResponse response) { @@ -109,4 +87,30 @@ public void jwtProvider(Member member, HttpServletResponse response) { redisClient.setValue(member.getUsername(), refreshToken, 864000000L); } + private LoginResponse buildLoginResponse(Member member) { + return LoginResponse.builder() + .username(member.getUsername()) + .role(member.getRole()) + .isFirst(member.getIsFirst()) + .build(); + + } + + private Claims getClaimsFromIdentityToken(String identityToken) throws InvalidKeySpecException, JsonProcessingException,AuthenticationException, NoSuchAlgorithmException{ + + // identity Token에서 헤더 추출 + Map appleTokenHeader = tokenService.parseHeaders(identityToken); + + // 애플 서버에서 publicKey 받아온 후에 identity 토큰의 헤더와 일치하는 publicKey 만들기 + PublicKey publicKey = applePublicKeyGenerator.generatePublicKey(appleTokenHeader, + appleAuthClient.getAppleAuthPublicKey()); + + // identity Token에서 claims 추출 + return tokenService.getTokenClaims(identityToken, publicKey); + + + + + } + }