Skip to content

Commit

Permalink
⚡️fix: 코드리뷰 반영-서비스 계층 분리
Browse files Browse the repository at this point in the history
  • Loading branch information
hyeyeon committed Feb 28, 2024
1 parent 48f8faa commit aa1d890
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 33 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public class OauthController {
@PostMapping("/oauth/login")
public ResponseEntity<ApiResponse<LoginResponse>> login(@RequestBody OauthTokenRequest tokenRequest) {
return ApiResponse.success(LOGIN_SUCCESS,
oauthService.login(tokenRequest.toServiceDto()));
LoginResponse.of(oauthService.login(tokenRequest.toServiceDto())));
}

@PostMapping("/oauth/reissue")
Expand Down
Original file line number Diff line number Diff line change
@@ -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
){

}
Original file line number Diff line number Diff line change
Expand Up @@ -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, "");
Expand Down
Original file line number Diff line number Diff line change
@@ -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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,22 +9,21 @@
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;
import sopt.org.motivoo.domain.user.entity.User;
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;
Expand All @@ -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);
Expand All @@ -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<User> 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<User> 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;
}


Expand All @@ -86,14 +85,12 @@ public User getUserProfile(String providerName, OauthTokenCommand tokenRequest,
String providerId = oAuth2UserInfo.getProviderId();
String nickName = oAuth2UserInfo.getNickName();

List<User> userEntity = userRepository.findBySocialId(providerId);
List<User> 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);
}
Expand Down Expand Up @@ -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;
}

Expand All @@ -162,9 +159,9 @@ private Map<String, Object> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -25,15 +26,15 @@ public class AppleLoginService {
private final PublicKeyGenerator publicKeyGenerator;
private final AppleClaimsValidator appleClaimsValidator;

public OAuthPlatformMemberResponse getApplePlatformMember(String identityToken) {
public OAuthPlatformMemberResult getApplePlatformMember(String identityToken) {
Map<String, String> headers = appleJwtParser.parseHeaders(identityToken);
ApplePublicKeys applePublicKeys = appleClient.getApplePublicKeys();

PublicKey publicKey = publicKeyGenerator.generatePublicKey(headers, applePublicKeys);

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) {
Expand Down

0 comments on commit aa1d890

Please sign in to comment.