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: