diff --git a/motivoo-api/src/main/java/sopt/org/motivoo/api/controller/auth/OauthController.java b/motivoo-api/src/main/java/sopt/org/motivoo/api/controller/auth/OauthController.java index 3af24d4..7286e68 100644 --- a/motivoo-api/src/main/java/sopt/org/motivoo/api/controller/auth/OauthController.java +++ b/motivoo-api/src/main/java/sopt/org/motivoo/api/controller/auth/OauthController.java @@ -33,7 +33,7 @@ public class OauthController { @PostMapping("/oauth/login") public ResponseEntity> login(@RequestBody OauthTokenRequest tokenRequest) { return ApiResponse.success(LOGIN_SUCCESS, - oauthService.login(tokenRequest.toServiceDto())); + LoginResponse.of(oauthService.login(tokenRequest.toServiceDto()))); } @PostMapping("/oauth/reissue") diff --git a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/dto/response/OAuthPlatformMemberResult.java b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/dto/response/OAuthPlatformMemberResult.java new file mode 100644 index 0000000..742637c --- /dev/null +++ b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/dto/response/OAuthPlatformMemberResult.java @@ -0,0 +1,13 @@ +package sopt.org.motivoo.domain.auth.dto.response; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Builder; + +@Builder +public record OAuthPlatformMemberResult ( + @JsonProperty("platform_id") + String platformId, + String email +){ + +} diff --git a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRepository.java b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRepository.java index 5651c36..898d5c7 100644 --- a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRepository.java +++ b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRepository.java @@ -56,7 +56,7 @@ public void saveBlockedToken(String accessToken) { setExpirationInRedis(key, expiration); } - private Date getExpirationFromToken(String accessToken) { + public Date getExpirationFromToken(String accessToken) { try { accessToken = accessToken.replaceAll("\\s+", ""); accessToken = accessToken.replace(BEARER_TYPE, ""); diff --git a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRetriever.java b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRetriever.java new file mode 100644 index 0000000..b5158f4 --- /dev/null +++ b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/repository/TokenRedisRetriever.java @@ -0,0 +1,41 @@ +package sopt.org.motivoo.domain.auth.repository; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; +import sopt.org.motivoo.domain.user.exception.UserException; + +import java.util.Date; + +import static sopt.org.motivoo.domain.user.exception.UserExceptionType.TOKEN_NOT_FOUND; + + +@Component +@RequiredArgsConstructor +public class TokenRedisRetriever { + private final TokenRedisRepository tokenRedisRepository; + public void saveRefreshToken(String refreshToken, String account) { + tokenRedisRepository.saveRefreshToken(refreshToken, account); + } + + + public void saveBlockedToken(String accessToken) { + tokenRedisRepository.saveBlockedToken(accessToken); + } + + private Date getExpirationFromToken(String accessToken) { + return tokenRedisRepository.getExpirationFromToken(accessToken); + } + + + public String getRefreshToken(String refreshToken) { + return tokenRedisRepository.findByRefreshToken(refreshToken).orElseThrow( + () -> new UserException(TOKEN_NOT_FOUND)); + } + + + public void deleteRefreshToken(String refreshToken) { + tokenRedisRepository.deleteRefreshToken(refreshToken); + } +} diff --git a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/OauthService.java b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/OauthService.java index bb6580d..1ef09ef 100644 --- a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/OauthService.java +++ b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/OauthService.java @@ -9,14 +9,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.reactive.function.client.WebClient; -import sopt.org.motivoo.api.controller.auth.dto.request.OauthTokenRequest; -import sopt.org.motivoo.api.controller.auth.dto.response.LoginResponse; import sopt.org.motivoo.api.controller.user.apple.OAuthPlatformMemberResponse; import sopt.org.motivoo.domain.auth.config.UserAuthentication; import sopt.org.motivoo.domain.auth.config.jwt.JwtTokenProvider; import sopt.org.motivoo.domain.auth.dto.request.OauthTokenCommand; import sopt.org.motivoo.domain.auth.dto.response.LoginResult; -import sopt.org.motivoo.domain.auth.repository.TokenRedisRepository; +import sopt.org.motivoo.domain.auth.dto.response.OAuthPlatformMemberResult; +import sopt.org.motivoo.domain.auth.repository.TokenRedisRetriever; import sopt.org.motivoo.domain.auth.service.apple.AppleLoginService; import sopt.org.motivoo.domain.user.dto.request.KakaoUserProfile; import sopt.org.motivoo.domain.user.entity.SocialPlatform; @@ -24,7 +23,7 @@ import sopt.org.motivoo.domain.user.entity.UserType; import sopt.org.motivoo.domain.user.exception.UserException; import sopt.org.motivoo.domain.user.exception.UserExceptionType; -import sopt.org.motivoo.domain.user.repository.UserRepository; +import sopt.org.motivoo.domain.user.repository.UserRetriever; import java.util.List; import java.util.Map; @@ -37,13 +36,13 @@ @RequiredArgsConstructor public class OauthService { private final InMemoryClientRegistrationRepository inMemoryRepository; - private final UserRepository userRepository; - private final TokenRedisRepository tokenRedisRepository; + private final UserRetriever userRetriever; + private final TokenRedisRetriever tokenRedisRetriever; private final JwtTokenProvider jwtTokenProvider; private final AppleLoginService appleLoginService; @Transactional - public LoginResponse login(OauthTokenCommand tokenRequest) { + public LoginResult login(OauthTokenCommand tokenRequest) { String providerName = tokenRequest.tokenType(); log.info("소셜플랫폼="+providerName); SocialPlatform socialPlatform = SocialPlatform.of(providerName); @@ -56,25 +55,25 @@ public LoginResponse login(OauthTokenCommand tokenRequest) { log.info("유저 아이디="+user.getId()); String accessToken = jwtTokenProvider.createAccessToken(new UserAuthentication(user.getId(), null, null)); - tokenRedisRepository.saveRefreshToken(refreshToken, String.valueOf(user.getId())); - LoginResult loginResult= LoginResult.of(user, accessToken, refreshToken); - return LoginResponse.of(loginResult); + tokenRedisRetriever.saveRefreshToken(refreshToken, String.valueOf(user.getId())); + return LoginResult.of(user, accessToken, refreshToken); } - OAuthPlatformMemberResponse applePlatformMember = appleLoginService.getApplePlatformMember(tokenRequest.accessToken()); + else if(socialPlatform.equals(SocialPlatform.APPLE)){ + OAuthPlatformMemberResult applePlatformMember = appleLoginService.getApplePlatformMember(tokenRequest.accessToken()); - List userEntity = userRepository.findBySocialId(applePlatformMember.getPlatformId()); - //처음 로그인 하거나 탈퇴한 경우 -> 회원가입 - if(userEntity==null || isWithdrawn(userEntity)){ - saveUser(null, applePlatformMember.getPlatformId(), socialPlatform, tokenRequest, refreshToken); - } - - //로그인 - updateRefreshToken(userEntity.get(0), refreshToken); - String accessToken = jwtTokenProvider.createAccessToken(new UserAuthentication(userEntity.get(0).getId(),null,null)); - LoginResult loginResult = LoginResult.of(userEntity.get(0), accessToken, refreshToken); - return LoginResponse.of(loginResult); + List userEntity = userRetriever.getUsersBySocialId(applePlatformMember.platformId()); + //처음 로그인 하거나 탈퇴한 경우 -> 회원가입 + if(userEntity==null || isWithdrawn(userEntity)){ + saveUser(null, applePlatformMember.platformId(), socialPlatform, tokenRequest, refreshToken); + } + //로그인 + updateRefreshToken(userEntity.get(0), refreshToken); + String accessToken = jwtTokenProvider.createAccessToken(new UserAuthentication(userEntity.get(0).getId(),null,null)); + return LoginResult.of(userEntity.get(0), accessToken, refreshToken); + } + return null; } @@ -86,14 +85,12 @@ public User getUserProfile(String providerName, OauthTokenCommand tokenRequest, String providerId = oAuth2UserInfo.getProviderId(); String nickName = oAuth2UserInfo.getNickName(); - List userEntity = userRepository.findBySocialId(providerId); + List userEntity = userRetriever.getUsersBySocialId(providerId); - //처음 로그인 하거나 탈퇴한 경우 -> 회원가입 if(userEntity==null || isWithdrawn(userEntity)){ return saveUser(nickName, providerId, socialPlatform, tokenRequest, refreshToken); } - //로그인 updateRefreshToken(userEntity.get(0), refreshToken); return userEntity.get(0); } @@ -145,7 +142,7 @@ public User saveUser(String nickName, String providerId, SocialPlatform socialPl .type(UserType.NONE) .deleted(Boolean.FALSE) .build(); - userRepository.save(newUser); + userRetriever.saveUser(newUser); return newUser; } @@ -162,9 +159,9 @@ private Map getUserAttributes(ClientRegistration provider, Oauth @Transactional public void logout(String accessToken) { - String refreshToken = userRepository.findRefreshTokenById(getAuthenticatedUser()); + String refreshToken = userRetriever.getRefreshTokenById(getAuthenticatedUser()); - tokenRedisRepository.saveBlockedToken(accessToken); - tokenRedisRepository.deleteRefreshToken(refreshToken); + tokenRedisRetriever.saveBlockedToken(accessToken); + tokenRedisRetriever.deleteRefreshToken(refreshToken); } } \ No newline at end of file diff --git a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/apple/AppleLoginService.java b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/apple/AppleLoginService.java index adf8561..7925c96 100644 --- a/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/apple/AppleLoginService.java +++ b/motivoo-domain/src/main/java/sopt/org/motivoo/domain/auth/service/apple/AppleLoginService.java @@ -12,6 +12,7 @@ import lombok.extern.slf4j.Slf4j; import sopt.org.motivoo.api.controller.user.apple.OAuthPlatformMemberResponse; import sopt.org.motivoo.common.advice.BusinessException; +import sopt.org.motivoo.domain.auth.dto.response.OAuthPlatformMemberResult; import sopt.org.motivoo.external.AppleClient; import sopt.org.motivoo.external.auth.apple.response.ApplePublicKeys; @@ -25,7 +26,7 @@ public class AppleLoginService { private final PublicKeyGenerator publicKeyGenerator; private final AppleClaimsValidator appleClaimsValidator; - public OAuthPlatformMemberResponse getApplePlatformMember(String identityToken) { + public OAuthPlatformMemberResult getApplePlatformMember(String identityToken) { Map headers = appleJwtParser.parseHeaders(identityToken); ApplePublicKeys applePublicKeys = appleClient.getApplePublicKeys(); @@ -33,7 +34,7 @@ public OAuthPlatformMemberResponse getApplePlatformMember(String identityToken) Claims claims = appleJwtParser.parsePublicKeyAndGetClaims(identityToken, publicKey); validateClaims(claims); - return new OAuthPlatformMemberResponse(claims.getSubject(), claims.get("email", String.class)); + return new OAuthPlatformMemberResult(claims.getSubject(), claims.get("email", String.class)); } private void validateClaims(Claims claims) {