Skip to content

Commit

Permalink
Merge pull request #63 from dnd-side-project/refactor/login_withdraw_…
Browse files Browse the repository at this point in the history
…logging

refactor: 애플 소셜 인증 기능 로깅 추가
  • Loading branch information
yeong0jae authored Feb 21, 2025
2 parents 7732ebf + ffa6342 commit 651ca96
Show file tree
Hide file tree
Showing 5 changed files with 30 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,9 +10,11 @@
import java.util.Base64;
import java.util.Date;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Slf4j
@RequiredArgsConstructor
@Component
public class AppleClientSecretGenerator {
Expand All @@ -28,7 +30,7 @@ public class AppleClientSecretGenerator {
@Value("${secret.oauth.apple.private-key}")
private String privateKey;

public String createClientSecret() throws NoSuchAlgorithmException, InvalidKeySpecException {
public String createClientSecret() {
final Date expireDate = Date.from(
LocalDateTime.now()
.plusMinutes(5)
Expand All @@ -45,10 +47,18 @@ public String createClientSecret() throws NoSuchAlgorithmException, InvalidKeySp
);
}

private PrivateKey getPrivateKey() throws NoSuchAlgorithmException, InvalidKeySpecException {
private PrivateKey getPrivateKey() {
final byte[] keyBytes = Base64.getDecoder().decode(privateKey);
final PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
final KeyFactory kf = KeyFactory.getInstance("EC");
return kf.generatePrivate(spec);
try {
final KeyFactory kf = KeyFactory.getInstance("EC");
return kf.generatePrivate(spec);
} catch (NoSuchAlgorithmException e) {
log.warn("존재하지 않는 키 생성 알고리즘입니다.");
throw new RuntimeException();
} catch (InvalidKeySpecException e) {
log.warn("Apple Private Key를 생성할 수 없습니다.");
throw new RuntimeException();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,13 @@ public String getSubjectFromIdToken(final String idToken) {
return null;
}

public void revoke(String authorizationCode) throws NoSuchAlgorithmException, InvalidKeySpecException {
public void revoke(String authorizationCode) {
final String clientSecret = appleClientSecretGenerator.createClientSecret();
log.info("Apple client secret을 생성합니다. clientSecret: {}", clientSecret);

final String refreshToken = appleApiClient.requestRefreshToken(clientSecret, authorizationCode);
log.info("Apple refresh token을 요청합니다. refreshToken: {}", refreshToken);

appleApiClient.requestRevoke(clientSecret, refreshToken);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,9 @@ public void validateToken(final String bearerToken) {
.verifyWith(Keys.hmacShaKeyFor(secret.getBytes()))
.build()
.parse(token);
log.info("토큰 검증에 성공하였습니다.");
log.info("JWT 검증에 성공하였습니다.");
} catch (Exception e) {
log.info("토큰 검증에 실패하였습니다.");
log.info("JWT 검증에 실패하였습니다.");
}
}

Expand Down Expand Up @@ -58,7 +58,7 @@ public String createToken(Long memberId) {
.signWith(Keys.hmacShaKeyFor(secret.getBytes()))
.compact();

log.info("토큰을 생성합니다. {}", token);
log.info("JWT를 생성합니다. {}", token);
return token;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
package site.dogether.auth.infrastructure.client.apple;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatusCode;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;
import site.dogether.auth.infrastructure.client.apple.response.ApplePublicKeySetResponse;
import site.dogether.auth.infrastructure.client.apple.response.AppleTokenResponse;

@Slf4j
@Component
public class AppleApiClient {

Expand Down Expand Up @@ -50,7 +52,9 @@ public void requestRevoke(final String clientSecret, final String refreshToken)
+ "&token_type_hint=" + "refresh_token")
.retrieve()
.onStatus(HttpStatusCode::is4xxClientError, (req, res) -> {
log.warn("Apple Revoke 요청에 실패하였습니다.");
throw new RuntimeException("Apple Revoke 요청에 실패하였습니다.");
});
log.info("Apple Revoke 요청에 성공하였습니다.");
}
}
10 changes: 4 additions & 6 deletions src/main/java/site/dogether/auth/service/AuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,14 @@ public class AuthService {
@Transactional
public AuthenticatedMember login(final LoginRequest request) {
final String subject = appleOAuthProvider.getSubjectFromIdToken(request.idToken());
log.info("subject of apple idToken 을 파싱합니다. sub: {}", subject);

Member member = new Member(
subject,
request.name()
);
member = memberService.save(member);
log.info("회원을 저장 or 조회합니다. providerId: {}", member.getProviderId());

final String authenticationToken = jwtHandler.createToken(member.getId());

Expand All @@ -41,12 +43,8 @@ public AuthenticatedMember login(final LoginRequest request) {
public void withdraw(final String authenticationToken, final WithdrawRequest request) {
final Long memberId = jwtHandler.getMemberId(authenticationToken);

try {
appleOAuthProvider.revoke(request.authorizationCode());
memberService.delete(memberId);
} catch (Exception e) {
throw new RuntimeException("애플 계정 해지(revoke) 실패로 회원 탈퇴를 진행할 수 없습니다.");
}
appleOAuthProvider.revoke(request.authorizationCode());
memberService.delete(memberId);
}

}

0 comments on commit 651ca96

Please sign in to comment.