From d388b83d4d0f3fb442132413cda8805f77a2dab3 Mon Sep 17 00:00:00 2001 From: dragontaek-lee Date: Tue, 2 Jan 2024 21:55:07 +0900 Subject: [PATCH 1/6] =?UTF-8?q?refactor:=20=EB=82=B4=EB=B6=80=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EA=B3=B5=ED=86=B5?= =?UTF-8?q?=ED=99=94=20#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/social/SocialCommonService.java | 4 ++ .../social/SocialCommonServiceImpl.java | 49 +++++++++++++++++++ .../gam/api/service/social/SocialService.java | 1 - 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gam/api/service/social/SocialCommonService.java b/src/main/java/com/gam/api/service/social/SocialCommonService.java index 02cd1c55..2d45306a 100644 --- a/src/main/java/com/gam/api/service/social/SocialCommonService.java +++ b/src/main/java/com/gam/api/service/social/SocialCommonService.java @@ -2,10 +2,14 @@ import com.gam.api.dto.social.request.SocialLogoutRequestDTO; import com.gam.api.dto.social.request.SocialRefreshRequestDTO; +import com.gam.api.dto.social.response.SocialLoginResponseDTO; import com.gam.api.dto.social.response.SocialRefreshResponseDTO; +import com.gam.api.entity.ProviderType; public interface SocialCommonService { void logout(SocialLogoutRequestDTO request); SocialRefreshResponseDTO refresh(SocialRefreshRequestDTO request); + + SocialLoginResponseDTO gamLogin(String thirdPartyUserId, ProviderType providerType); } diff --git a/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java b/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java index 3be276b9..774e230c 100644 --- a/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java +++ b/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java @@ -3,10 +3,15 @@ import com.gam.api.common.message.ExceptionMessage; import com.gam.api.common.exception.AuthException; import com.gam.api.common.util.RedisUtil; +import com.gam.api.config.GamConfig; import com.gam.api.config.jwt.JwtTokenManager; import com.gam.api.dto.social.request.SocialLogoutRequestDTO; import com.gam.api.dto.social.request.SocialRefreshRequestDTO; +import com.gam.api.dto.social.response.SocialLoginResponseDTO; import com.gam.api.dto.social.response.SocialRefreshResponseDTO; +import com.gam.api.entity.*; +import com.gam.api.repository.AuthProviderRepository; +import com.gam.api.repository.UserRepository; import lombok.RequiredArgsConstructor; import lombok.val; import org.springframework.data.redis.core.RedisTemplate; @@ -20,7 +25,14 @@ @Service public class SocialCommonServiceImpl implements SocialCommonService { private final JwtTokenManager jwtTokenManager; + private final AuthProviderRepository authProviderRepository; + private final UserRepository userRepository; private final RedisTemplate redisTemplate; + private final GamConfig gamConfig; + + public boolean chkProfileCompleted(User user) { + return !Objects.isNull(user.getInfo()) && !Objects.isNull(user.getUserTag()); + } @Override @Transactional @@ -78,4 +90,41 @@ public SocialRefreshResponseDTO refresh(SocialRefreshRequestDTO socialRefreshReq return SocialRefreshResponseDTO.of(accessToken, refreshToken); } + + @Override + @Transactional + public SocialLoginResponseDTO gamLogin(String thirdPartyUserId, ProviderType providerType) { + val authProvider = authProviderRepository.searchAuthProviderById(thirdPartyUserId); + + if(Objects.nonNull(authProvider)) { + val user = authProvider.getUser(); + val userId = user.getId(); + val accessToken = jwtTokenManager.createAccessToken(userId); + val refreshToken = jwtTokenManager.createRefreshToken(userId); + + RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); + + val isProfileCompleted = chkProfileCompleted(user); + return SocialLoginResponseDTO.of(true, isProfileCompleted, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + } + + val user = userRepository.save(User.builder() + .role(Role.USER) + .userStatus(UserStatus.NOT_PERMITTED) + .build()); + + val userId = user.getId(); + val accessToken = jwtTokenManager.createAccessToken(userId); + val refreshToken = jwtTokenManager.createRefreshToken(userId); + + RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); + + authProviderRepository.save(AuthProvider.builder() + .id(thirdPartyUserId) + .user(user) + .providerType(providerType) + .build()); + + return SocialLoginResponseDTO.of(false, false, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + } } diff --git a/src/main/java/com/gam/api/service/social/SocialService.java b/src/main/java/com/gam/api/service/social/SocialService.java index 7bdf340f..d7988b03 100644 --- a/src/main/java/com/gam/api/service/social/SocialService.java +++ b/src/main/java/com/gam/api/service/social/SocialService.java @@ -6,5 +6,4 @@ public interface SocialService { SocialLoginResponseDTO login(SocialLoginRequestDTO request); - boolean chkProfileCompleted(User user); } From c0b2f24bb1b304685f55cd0680c517bb656c6ac6 Mon Sep 17 00:00:00 2001 From: dragontaek-lee Date: Tue, 2 Jan 2024 21:55:32 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20kakao=20login=20response=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=20#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gam/api/dto/kakao/KakaoUserResponse.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/gam/api/dto/kakao/KakaoUserResponse.java b/src/main/java/com/gam/api/dto/kakao/KakaoUserResponse.java index 422d21aa..90bd45c9 100644 --- a/src/main/java/com/gam/api/dto/kakao/KakaoUserResponse.java +++ b/src/main/java/com/gam/api/dto/kakao/KakaoUserResponse.java @@ -4,4 +4,4 @@ import com.fasterxml.jackson.databind.annotation.JsonNaming; @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) -public record KakaoUserResponse(String id) {} +public record KakaoUserResponse(String id, String connected_at) {} \ No newline at end of file From fbdfb2eebd3a7cf74004ad74fc791449b30fda9d Mon Sep 17 00:00:00 2001 From: dragontaek-lee Date: Tue, 2 Jan 2024 21:56:52 +0900 Subject: [PATCH 3/6] =?UTF-8?q?fix:=20kakao,=20apple=20=EB=82=B4=EB=B6=80?= =?UTF-8?q?=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=A1=9C=EC=A7=81=20=EA=B3=B5?= =?UTF-8?q?=EC=9A=A9=ED=99=94=20#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/social/AppleSocialService.java | 59 +--------------- .../service/social/KakaoSocialService.java | 70 ++++--------------- 2 files changed, 14 insertions(+), 115 deletions(-) diff --git a/src/main/java/com/gam/api/service/social/AppleSocialService.java b/src/main/java/com/gam/api/service/social/AppleSocialService.java index 5a3e6be9..5a83108b 100644 --- a/src/main/java/com/gam/api/service/social/AppleSocialService.java +++ b/src/main/java/com/gam/api/service/social/AppleSocialService.java @@ -1,78 +1,28 @@ package com.gam.api.service.social; import com.gam.api.common.exception.AuthException; -import com.gam.api.common.util.RedisUtil; -import com.gam.api.config.GamConfig; -import com.gam.api.config.jwt.JwtTokenManager; import com.gam.api.dto.social.response.SocialLoginResponseDTO; -import com.gam.api.entity.AuthProvider; -import com.gam.api.entity.Role; -import com.gam.api.entity.User; -import com.gam.api.entity.UserStatus; -import com.gam.api.repository.AuthProviderRepository; -import com.gam.api.repository.UserRepository; import com.nimbusds.jwt.SignedJWT; import lombok.RequiredArgsConstructor; import lombok.val; -import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import com.gam.api.dto.social.request.SocialLoginRequestDTO; import javax.transaction.Transactional; import java.text.ParseException; -import java.util.Objects; @Service @RequiredArgsConstructor public class AppleSocialService implements SocialService { - private final AuthProviderRepository authProviderRepository; - private final UserRepository userRepository; - - private final JwtTokenManager jwtTokenManager; - private final GamConfig gamConfig; - - private final RedisTemplate redisTemplate; + private final SocialCommonService socialCommonService; @Override @Transactional public SocialLoginResponseDTO login(SocialLoginRequestDTO request) { val appleUserId = getUserInfo(request.token()); - val parsedAppleUserId = appleUserId; - - val authProvider = authProviderRepository.searchAuthProviderById(parsedAppleUserId); - - if (Objects.nonNull(authProvider)) { - val user = authProvider.getUser(); - val userId = user.getId(); - val accessToken = jwtTokenManager.createAccessToken(userId); - val refreshToken = jwtTokenManager.createRefreshToken(userId); - - RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); - - val isProfileCompleted = chkProfileCompleted(user); - return SocialLoginResponseDTO.of(true, isProfileCompleted, userId, accessToken, refreshToken, gamConfig.getAppVersion()); - } - - val user = userRepository.save(User.builder() - .role(Role.USER) - .userStatus(UserStatus.NOT_PERMITTED) - .build()); - - val userId = user.getId(); - val accessToken = jwtTokenManager.createAccessToken(userId); - val refreshToken = jwtTokenManager.createRefreshToken(userId); - - RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); - - authProviderRepository.save(AuthProvider.builder() - .id(parsedAppleUserId) - .user(user) - .providerType(request.providerType()) - .build()); - - return SocialLoginResponseDTO.of(false, false, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + return socialCommonService.gamLogin(appleUserId, request.providerType()); } private String getUserInfo (String idToken) { @@ -85,9 +35,4 @@ private String getUserInfo (String idToken) { throw new AuthException("잘못된 토큰입니다.", HttpStatus.BAD_REQUEST); } } - - @Override - public boolean chkProfileCompleted(User user) { - return !Objects.isNull(user.getInfo()) && !Objects.isNull(user.getUserTag()); - } } diff --git a/src/main/java/com/gam/api/service/social/KakaoSocialService.java b/src/main/java/com/gam/api/service/social/KakaoSocialService.java index 7c85e91a..59af8d76 100644 --- a/src/main/java/com/gam/api/service/social/KakaoSocialService.java +++ b/src/main/java/com/gam/api/service/social/KakaoSocialService.java @@ -1,80 +1,34 @@ package com.gam.api.service.social; -import com.gam.api.common.util.RedisUtil; -import com.gam.api.config.GamConfig; -import com.gam.api.config.jwt.JwtTokenManager; +import com.gam.api.common.exception.AuthException; +import com.gam.api.common.message.ExceptionMessage; +import com.gam.api.dto.kakao.KakaoUserResponse; import com.gam.api.dto.social.response.SocialLoginResponseDTO; -import com.gam.api.entity.AuthProvider; -import com.gam.api.entity.Role; -import com.gam.api.entity.User; -import com.gam.api.entity.UserStatus; -import com.gam.api.repository.AuthProviderRepository; -import com.gam.api.repository.UserRepository; +import feign.FeignException; import lombok.RequiredArgsConstructor; -import lombok.val; -import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import com.gam.api.external.kakao.KakaoApiClient; import com.gam.api.dto.social.request.SocialLoginRequestDTO; import javax.transaction.Transactional; -import java.util.Objects; @Service @RequiredArgsConstructor public class KakaoSocialService implements SocialService { - - private final AuthProviderRepository authProviderRepository; - private final UserRepository userRepository; - private final KakaoApiClient kakaoApiClient; - - private final JwtTokenManager jwtTokenManager; - private final GamConfig gamConfig; - - private final RedisTemplate redisTemplate; + private final SocialCommonService socialCommonService; @Override @Transactional public SocialLoginResponseDTO login(SocialLoginRequestDTO request) { - val userResponse = kakaoApiClient.getUserInformation("Bearer " + request.token()); - - val authProvider = authProviderRepository.searchAuthProviderById(userResponse.id()); - - if(Objects.nonNull(authProvider)) { - val user = authProvider.getUser(); - val userId = user.getId(); - val accessToken = jwtTokenManager.createAccessToken(userId); - val refreshToken = jwtTokenManager.createRefreshToken(userId); - - RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); - - val isProfileCompleted = chkProfileCompleted(user); - return SocialLoginResponseDTO.of(true, isProfileCompleted, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + KakaoUserResponse userResponse; + try { + userResponse = kakaoApiClient.getUserInformation("Bearer " + request.token()); + } catch (FeignException feignException) { + throw new AuthException(ExceptionMessage.INVALID_KAKAO_TOKEN.getMessage(), HttpStatus.BAD_REQUEST); } - val user = userRepository.save(User.builder() - .role(Role.USER) - .userStatus(UserStatus.NOT_PERMITTED) - .build()); - - val userId = user.getId(); - val accessToken = jwtTokenManager.createAccessToken(userId); - val refreshToken = jwtTokenManager.createRefreshToken(userId); - - RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); - - authProviderRepository.save(AuthProvider.builder() - .id(userResponse.id()) - .user(user) - .providerType(request.providerType()) - .build()); - - return SocialLoginResponseDTO.of(false, false, userId, accessToken, refreshToken, gamConfig.getAppVersion()); - } - - @Override - public boolean chkProfileCompleted(User user) { - return !Objects.isNull(user.getInfo()) && !Objects.isNull(user.getUserTag()); + return socialCommonService.gamLogin(userResponse.id(), request.providerType()); } } From ab2f5d20a1d267d12aaefd30d70d60a3601e30b3 Mon Sep 17 00:00:00 2001 From: dragontaek-lee Date: Tue, 2 Jan 2024 21:57:05 +0900 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C?= =?UTF-8?q?=20import=20=EC=A0=9C=EA=B1=B0=20#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gam/api/service/social/SocialService.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/com/gam/api/service/social/SocialService.java b/src/main/java/com/gam/api/service/social/SocialService.java index d7988b03..8d00aa09 100644 --- a/src/main/java/com/gam/api/service/social/SocialService.java +++ b/src/main/java/com/gam/api/service/social/SocialService.java @@ -2,7 +2,6 @@ import com.gam.api.dto.social.request.SocialLoginRequestDTO; import com.gam.api.dto.social.response.SocialLoginResponseDTO; -import com.gam.api.entity.User; public interface SocialService { SocialLoginResponseDTO login(SocialLoginRequestDTO request); From 16c34aaa096bdbd7784bd973fabfd936dfa18f00 Mon Sep 17 00:00:00 2001 From: dragontaek-lee Date: Tue, 2 Jan 2024 21:57:24 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EC=B9=B4=EC=B9=B4=EC=98=A4=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EC=98=88=EC=99=B8=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EB=A9=94=EC=84=B8=EC=A7=80=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/gam/api/common/message/ExceptionMessage.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gam/api/common/message/ExceptionMessage.java b/src/main/java/com/gam/api/common/message/ExceptionMessage.java index dc34df26..93f31991 100644 --- a/src/main/java/com/gam/api/common/message/ExceptionMessage.java +++ b/src/main/java/com/gam/api/common/message/ExceptionMessage.java @@ -9,6 +9,7 @@ public enum ExceptionMessage { /** auth **/ EMPTY_TOKEN("빈 토큰입니다."), INVALID_TOKEN("유효하지 않은 토큰입니다."), + INVALID_KAKAO_TOKEN("유효하지 않은 카카오 토큰입니다."), EXPIRED_TOKEN("만료된 토큰입니다."), INVALID_SIGNATURE("유효하지 않은 서명입니다."), PROFILE_UNCOMPLETED_USER("마이페이지를 작성하지 않은 유저입니다."), From 27f7bc6a64944de8b108bf59ce4f62cee22ba91a Mon Sep 17 00:00:00 2001 From: dragontaek-lee Date: Tue, 2 Jan 2024 22:27:46 +0900 Subject: [PATCH 6/6] =?UTF-8?q?refactor:=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=84=B8=EB=B6=80=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC=20#106?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../social/SocialCommonServiceImpl.java | 65 ++++++++++--------- 1 file changed, 36 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java b/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java index 774e230c..8e3e555b 100644 --- a/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java +++ b/src/main/java/com/gam/api/service/social/SocialCommonServiceImpl.java @@ -30,10 +30,42 @@ public class SocialCommonServiceImpl implements SocialCommonService { private final RedisTemplate redisTemplate; private final GamConfig gamConfig; - public boolean chkProfileCompleted(User user) { + private boolean chkProfileCompleted(User user) { return !Objects.isNull(user.getInfo()) && !Objects.isNull(user.getUserTag()); } + private SocialLoginResponseDTO reLogin(User user) { + val userId = user.getId(); + val accessToken = jwtTokenManager.createAccessToken(userId); + val refreshToken = jwtTokenManager.createRefreshToken(userId); + + RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); + + val isProfileCompleted = chkProfileCompleted(user); + return SocialLoginResponseDTO.of(true, isProfileCompleted, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + } + + private SocialLoginResponseDTO SignUpAndLogin(String thirdPartyUserId, ProviderType providerType) { + val user = userRepository.save(User.builder() + .role(Role.USER) + .userStatus(UserStatus.NOT_PERMITTED) + .build()); + + val userId = user.getId(); + val accessToken = jwtTokenManager.createAccessToken(userId); + val refreshToken = jwtTokenManager.createRefreshToken(userId); + + RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); + + authProviderRepository.save(AuthProvider.builder() + .id(thirdPartyUserId) + .user(user) + .providerType(providerType) + .build()); + + return SocialLoginResponseDTO.of(false, false, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + } + @Override @Transactional public void logout(SocialLogoutRequestDTO socialLogoutRequestDTO) { @@ -96,35 +128,10 @@ public SocialRefreshResponseDTO refresh(SocialRefreshRequestDTO socialRefreshReq public SocialLoginResponseDTO gamLogin(String thirdPartyUserId, ProviderType providerType) { val authProvider = authProviderRepository.searchAuthProviderById(thirdPartyUserId); - if(Objects.nonNull(authProvider)) { - val user = authProvider.getUser(); - val userId = user.getId(); - val accessToken = jwtTokenManager.createAccessToken(userId); - val refreshToken = jwtTokenManager.createRefreshToken(userId); - - RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); - - val isProfileCompleted = chkProfileCompleted(user); - return SocialLoginResponseDTO.of(true, isProfileCompleted, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + if (Objects.nonNull(authProvider)) { + return reLogin(authProvider.getUser()); } - val user = userRepository.save(User.builder() - .role(Role.USER) - .userStatus(UserStatus.NOT_PERMITTED) - .build()); - - val userId = user.getId(); - val accessToken = jwtTokenManager.createAccessToken(userId); - val refreshToken = jwtTokenManager.createRefreshToken(userId); - - RedisUtil.saveRefreshToken(redisTemplate, refreshToken, userId); - - authProviderRepository.save(AuthProvider.builder() - .id(thirdPartyUserId) - .user(user) - .providerType(providerType) - .build()); - - return SocialLoginResponseDTO.of(false, false, userId, accessToken, refreshToken, gamConfig.getAppVersion()); + return SignUpAndLogin(thirdPartyUserId, providerType); } }