feat: 구글 로그인 — 같은 이메일이면 기존 계정에 자동 연결
- member.google_id 컬럼 추가(멱등 ALTER) + 기존 GOOGLE 계정 sub 백필 - googleLogin: google_id 조회 → 없으면 검증된 동일 이메일 계정(LOCAL 우선)에 연결 → 그래도 없으면 신규 생성. provider 는 유지(아이디 로그인/프로필 편집 보존) - MemberMapper: findByGoogleId/findByEmailForLink/linkGoogle 추가, google_id 매핑 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
09efd65fa9
commit
b48d8c667c
@@ -183,12 +183,30 @@ public class AuthService {
|
||||
}
|
||||
String sub = String.valueOf(info.get("sub"));
|
||||
String email = info.get("email") == null ? null : String.valueOf(info.get("email"));
|
||||
boolean emailVerified = "true".equals(String.valueOf(info.get("email_verified")));
|
||||
String name = info.get("name") != null ? String.valueOf(info.get("name"))
|
||||
: (email != null ? email.split("@")[0] : "사용자");
|
||||
|
||||
Member member = memberMapper.findByProvider("GOOGLE", sub);
|
||||
// 1) 구글 sub 로 이미 연결/가입된 계정 조회
|
||||
Member member = memberMapper.findByGoogleId(sub);
|
||||
|
||||
// 2) 없으면 같은 (검증된)이메일의 기존 계정에 구글 연결 — 중복 계정/데이터 분리 방지
|
||||
if (member == null && email != null && !email.isBlank() && emailVerified) {
|
||||
Member existing = memberMapper.findByEmailForLink(email);
|
||||
if (existing != null) {
|
||||
if (!"ACTIVE".equals(existing.getStatus())) {
|
||||
throw new ApiException(HttpStatus.FORBIDDEN, "사용할 수 없는 계정입니다.");
|
||||
}
|
||||
memberMapper.linkGoogle(existing.getId(), sub);
|
||||
existing.setGoogleId(sub);
|
||||
member = existing;
|
||||
log.info("[google] linked to existing member id={} provider={} email={}",
|
||||
member.getId(), member.getProvider(), email);
|
||||
}
|
||||
}
|
||||
|
||||
// 3) 그래도 없으면 신규 구글 계정 생성(최초 로그인 = 가입). 가입 제한 시 차단.
|
||||
if (member == null) {
|
||||
// 최초 로그인 = 가입. 가입 제한 시 차단.
|
||||
if (!appSettingService.isSignupEnabled()) {
|
||||
throw new ApiException(HttpStatus.FORBIDDEN, "현재 회원가입이 제한되어 있습니다.");
|
||||
}
|
||||
@@ -197,6 +215,7 @@ public class AuthService {
|
||||
.email(email)
|
||||
.provider("GOOGLE")
|
||||
.providerId(sub)
|
||||
.googleId(sub)
|
||||
.role("USER")
|
||||
.status("ACTIVE")
|
||||
.build();
|
||||
|
||||
Reference in New Issue
Block a user