From 37bfc6938646dbdf5b5390e9b061065bbd38acd1 Mon Sep 17 00:00:00 2001 From: Ssamssamukja <109636635+Ssamssamukja@users.noreply.github.com> Date: Tue, 3 Mar 2026 02:28:03 +0900 Subject: [PATCH] =?UTF-8?q?[Fix/#378]=20Apple=20login=20=EC=98=A4=EB=A5=98?= =?UTF-8?q?=20=ED=95=B4=EA=B2=B0=20(#379)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: scope에 email 추가 * fix: fallback 로직 추가 --- .../auth/service/CustomOAuth2UserService.java | 23 ++++++++++++++++++- .../src/main/resources/application-dev.yml | 1 + .../src/main/resources/application-local.yml | 1 + .../src/main/resources/application-prod.yml | 1 + 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/clokey-api/src/main/java/org/clokey/domain/auth/service/CustomOAuth2UserService.java b/clokey-api/src/main/java/org/clokey/domain/auth/service/CustomOAuth2UserService.java index 4fc50d5e..106d9a67 100644 --- a/clokey-api/src/main/java/org/clokey/domain/auth/service/CustomOAuth2UserService.java +++ b/clokey-api/src/main/java/org/clokey/domain/auth/service/CustomOAuth2UserService.java @@ -18,6 +18,7 @@ import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; @Slf4j @Service @@ -57,6 +58,7 @@ public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2Authenticatio OauthProvider oauthProvider = OauthProvider.valueOf(provider.toUpperCase()); OauthInfo oauthInfo = OauthInfo.createOauthInfo(oauthId, oauthProvider); + String resolvedEmail = resolveEmail(email, oauthId, oauthProvider); log.info("[OIDC] 회원 조회 시작 - Provider: {}, OAuthId: {}", provider, oauthId); Member member = @@ -70,7 +72,7 @@ public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2Authenticatio email); Member newMember = Member.createMember( - email, + resolvedEmail, uniqueUtil.generateRandomNickname(), oauthInfo); memberRepository.save(newMember); @@ -112,4 +114,23 @@ public OidcUser loadUser(OidcUserRequest userRequest) throws OAuth2Authenticatio throw new OAuth2AuthenticationException(oauth2Error, e); } } + + private String resolveEmail(String email, String oauthId, OauthProvider oauthProvider) { + if (StringUtils.hasText(email)) { + return email; + } + + String safeOauthId = oauthId.replaceAll("[^a-zA-Z0-9._-]", "_"); + if (safeOauthId.length() > 80) { + safeOauthId = safeOauthId.substring(0, 80); + } + String fallbackEmail = + oauthProvider.name().toLowerCase() + "_" + safeOauthId + "@noemail.local"; + log.warn( + "[OIDC] Email claim missing. Fallback email is used - Provider: {}, OAuthId: {}, FallbackEmail: {}", + oauthProvider, + oauthId, + fallbackEmail); + return fallbackEmail; + } } diff --git a/clokey-api/src/main/resources/application-dev.yml b/clokey-api/src/main/resources/application-dev.yml index 510844cb..5c844a16 100644 --- a/clokey-api/src/main/resources/application-dev.yml +++ b/clokey-api/src/main/resources/application-dev.yml @@ -57,6 +57,7 @@ spring: client-authentication-method: client_secret_post scope: - openid + - email provider: apple provider: kakao: diff --git a/clokey-api/src/main/resources/application-local.yml b/clokey-api/src/main/resources/application-local.yml index fdcf9a05..38e94c4b 100644 --- a/clokey-api/src/main/resources/application-local.yml +++ b/clokey-api/src/main/resources/application-local.yml @@ -57,6 +57,7 @@ spring: client-authentication-method: client_secret_post scope: - openid + - email provider: apple provider: kakao: diff --git a/clokey-api/src/main/resources/application-prod.yml b/clokey-api/src/main/resources/application-prod.yml index 61aaadff..14985f1c 100644 --- a/clokey-api/src/main/resources/application-prod.yml +++ b/clokey-api/src/main/resources/application-prod.yml @@ -57,6 +57,7 @@ spring: client-authentication-method: client_secret_post scope: - openid + - email provider: apple provider: kakao: