Skip to content

Commit

Permalink
[MS-170] Fix: 회원탈퇴 영속성 문제 해결
Browse files Browse the repository at this point in the history
  • Loading branch information
YooJisu826 committed Aug 5, 2024
1 parent e6fa856 commit c086096
Show file tree
Hide file tree
Showing 4 changed files with 57 additions and 28 deletions.
2 changes: 1 addition & 1 deletion config
Original file line number Diff line number Diff line change
Expand Up @@ -20,19 +20,18 @@
import com.modutaxi.api.domain.member.service.UpdateMemberService;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.openssl.PEMException;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.springframework.stereotype.Service;

import java.security.PrivateKey;
import java.security.Security;
import java.time.LocalDateTime;
import java.util.Base64;
import java.util.Date;
import java.util.NoSuchElementException;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.bouncycastle.asn1.pkcs.PrivateKeyInfo;
import org.bouncycastle.openssl.PEMException;
import org.bouncycastle.openssl.jcajce.JcaPEMKeyConverter;
import org.springframework.stereotype.Service;


@Slf4j
Expand All @@ -49,12 +48,16 @@ public void appleServerToServer(StsPayload payload) {
try {
Events events = null;
try {
events = new ObjectMapper().readValue(decodePayload(payload.getPayload(), StsRequest.class).getEvents(), Events.class);
events = new ObjectMapper().readValue(
decodePayload(payload.getPayload(), StsRequest.class).getEvents(),
Events.class);
} catch (JsonProcessingException e) {
log.error("Apple Server To Server Error : Object Mapper Error");
}
if (events.getType().equals("consent-revoked") || events.getType().equals("account-delete")) {
updateMemberService.deleteMember(getMemberService.getMemberByAppleSnsId(events.getSub()));
if (events.getType().equals("consent-revoked") || events.getType()
.equals("account-delete")) {
updateMemberService.deleteMember(
getMemberService.getMemberByAppleSnsId(events.getSub()).getId());
appleRefreshTokenMongoRepository.deleteById(events.getSub());
}
} catch (BaseException e) {
Expand All @@ -64,8 +67,10 @@ public void appleServerToServer(StsPayload payload) {

private <T> T decodePayload(String token, Class<T> targetClass) {
try {
return (new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false))
.readValue(new String(Base64.getDecoder().decode(token.split("\\.")[1])), targetClass);
return (new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false))
.readValue(new String(Base64.getDecoder().decode(token.split("\\.")[1])),
targetClass);
} catch (JsonProcessingException e) {
log.error("Apple Server To Server payload 디코딩 실패 : {}", token);
throw new BaseException(null); // api 이용자는 Apple 인증서버이므로 에러를 보내지 않아도 됨
Expand All @@ -82,9 +87,11 @@ public AppleIdTokenPayload getAppleIdTokenResponse(String authorizationCode) {
null,
null
));
AppleIdTokenPayload appleIdTokenPayload = decodeUrlPayload(appleSocialTokenResponse.getIdToken(), AppleIdTokenPayload.class);
AppleIdTokenPayload appleIdTokenPayload = decodeUrlPayload(
appleSocialTokenResponse.getIdToken(), AppleIdTokenPayload.class);
appleRefreshTokenMongoRepository.deleteById(appleIdTokenPayload.getSub());
appleRefreshTokenMongoRepository.save(new AppleRefreshToken(appleIdTokenPayload.getSub(), appleSocialTokenResponse.getRefreshToken()));
appleRefreshTokenMongoRepository.save(new AppleRefreshToken(appleIdTokenPayload.getSub(),
appleSocialTokenResponse.getRefreshToken()));
return appleIdTokenPayload;
}

Expand All @@ -104,7 +111,8 @@ private String generateClientSecret() {
private PrivateKey getPrivateKey() {
Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
try {
byte[] privateKeyBytes = Base64.getDecoder().decode(appleOauthProperties.getPrivate_key());
byte[] privateKeyBytes = Base64.getDecoder()
.decode(appleOauthProperties.getPrivate_key());
PrivateKeyInfo privateKeyInfo = PrivateKeyInfo.getInstance(privateKeyBytes);
return (new JcaPEMKeyConverter().setProvider("BC")).getPrivateKey(privateKeyInfo);
} catch (PEMException e) {
Expand All @@ -115,8 +123,10 @@ private PrivateKey getPrivateKey() {

private <T> T decodeUrlPayload(String token, Class<T> targetClass) {
try {
return (new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false))
.readValue(new String(Base64.getUrlDecoder().decode(token.split("\\.")[1])), targetClass);
return (new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,
false))
.readValue(new String(Base64.getUrlDecoder().decode(token.split("\\.")[1])),
targetClass);
} catch (JsonProcessingException e) {
log.error("Apple Id Token Payload 디코딩 실패 : {}", token);
throw new BaseException(AuthErrorCode.APPLE_LOGIN_ERROR);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,13 @@
import com.modutaxi.api.common.auth.oauth.apple.service.AppleService;
import com.modutaxi.api.common.exception.errorcode.MailErrorCode;
import com.modutaxi.api.common.exception.errorcode.SmsErrorCode;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.*;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.ConfirmMailCertificationReqeust;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.ConfirmSmsCertificationReqeustWithJwt;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.ConfirmSmsCertificationReqeustWithSignupKey;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.SendMailCertificationRequest;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.SendSmsCertificationRequestWithJwt;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.SendSmsCertificationRequestWithSignupKey;
import com.modutaxi.api.domain.member.dto.MemberRequestDto.UpdateProfileRequest;
import com.modutaxi.api.domain.member.dto.MemberResponseDto.CertificationResponse;
import com.modutaxi.api.domain.member.dto.MemberResponseDto.TokenAndMemberResponse;
import com.modutaxi.api.domain.member.dto.MemberResponseDto.UpdateProfileResponse;
Expand All @@ -20,7 +26,12 @@
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
Expand Down Expand Up @@ -196,7 +207,8 @@ public ResponseEntity<CertificationResponse> confirmEmailCertification(
public ResponseEntity<CertificationResponse> sendSmsCertification(
@RequestBody SendSmsCertificationRequestWithSignupKey request) {
return ResponseEntity.ok(
updateMemberService.sendSmsCertificationWithSignupKey(request.getKey(), request.getPhoneNumber()));
updateMemberService.sendSmsCertificationWithSignupKey(request.getKey(),
request.getPhoneNumber()));
}

@Operation(
Expand Down Expand Up @@ -243,7 +255,8 @@ public ResponseEntity<CertificationResponse> sendSmsCertificationWithJwt(
@CurrentMember Member member,
@RequestBody SendSmsCertificationRequestWithJwt request) {
return ResponseEntity.ok(
updateMemberService.sendSmsCertificationWithJwt(member.getId(), request.getPhoneNumber()));
updateMemberService.sendSmsCertificationWithJwt(member.getId(),
request.getPhoneNumber()));
}

@Operation(
Expand Down Expand Up @@ -288,8 +301,9 @@ public ResponseEntity<CertificationResponse> sendSmsCertificationWithJwt(
@PostMapping("/sms/confirm")
public ResponseEntity<CertificationResponse> confirmSmsCertificationWithSignupKey(
@RequestBody ConfirmSmsCertificationReqeustWithSignupKey request) {
return ResponseEntity.ok(updateMemberService.checkSmsCertificationCodeWithSignupKey(request.getKey(),
request.getPhoneNumber(), request.getCertificationCode()));
return ResponseEntity.ok(
updateMemberService.checkSmsCertificationCodeWithSignupKey(request.getKey(),
request.getPhoneNumber(), request.getCertificationCode()));
}

@Operation(
Expand Down Expand Up @@ -335,8 +349,9 @@ public ResponseEntity<CertificationResponse> confirmSmsCertificationWithSignupKe
public ResponseEntity<CertificationResponse> confirmSmsCertificationWithJwt(
@CurrentMember Member member,
@RequestBody ConfirmSmsCertificationReqeustWithJwt request) {
return ResponseEntity.ok(updateMemberService.checkSmsCertificationCodeWithJwt(member.getId(),
request.getPhoneNumber(), request.getCertificationCode()));
return ResponseEntity.ok(
updateMemberService.checkSmsCertificationCodeWithJwt(member.getId(),
request.getPhoneNumber(), request.getCertificationCode()));
}

/**
Expand Down Expand Up @@ -375,7 +390,7 @@ public ResponseEntity<UpdateProfileResponse> updateMemberProfile(
@DeleteMapping("")
public ResponseEntity<Integer> deleteMember(
@CurrentMember Member member) {
updateMemberService.deleteMember(member);
updateMemberService.deleteMember(member.getId());
appleService.revokeToken(member.getSnsId());
return ResponseEntity.ok(200);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import com.modutaxi.api.common.auth.jwt.JwtTokenProvider;
import com.modutaxi.api.common.exception.BaseException;
import com.modutaxi.api.common.exception.errorcode.MailErrorCode;
import com.modutaxi.api.common.exception.errorcode.MemberErrorCode;
import com.modutaxi.api.common.exception.errorcode.SmsErrorCode;
import com.modutaxi.api.common.s3.S3Service;
import com.modutaxi.api.domain.account.repository.AccountRepository;
Expand Down Expand Up @@ -137,7 +138,10 @@ public UpdateProfileResponse updateProfile(Member member, String name, Gender ge
}

@Transactional
public void deleteMember(Member member) {
public void deleteMember(Long id) {
Member member = memberRepository.findById(id).orElseThrow(
() -> new BaseException(MemberErrorCode.EMPTY_MEMBER)
);
// 멤버 soft delete
member.delete();
// 계좌 정보 hard delete
Expand Down

0 comments on commit c086096

Please sign in to comment.