From 6c0f1778c8de177d18a7fc617085c49a80b2632a Mon Sep 17 00:00:00 2001 From: ttipo Date: Mon, 22 Jun 2026 13:49:48 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EB=AF=B8=EC=9D=B8=EC=A6=9D=20=EB=A1=9C?= =?UTF-8?q?=EA=B7=B8=EC=9D=B8=20=EC=8B=9C=20=EC=9D=B8=EC=A6=9D=20=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=EC=9E=90=EB=8F=99=20=EB=B0=9C=EC=86=A1=20=ED=9B=84?= =?UTF-8?q?=20=EB=B0=9C=EC=86=A1=20=EC=99=84=EB=A3=8C=20=ED=99=94=EB=A9=B4?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 로그인 화면 상단 인라인 재발송 배너를 제거하고, 미인증(403) 로그인 시도 시 인증 메일을 즉시 발송한 뒤 /signup?sent=<이메일> 의 '발송 완료' 화면으로 이동하도록 변경. SignupPage 는 sent 쿼리로 진입하면 곧바로 발송 완료 단계를 표시한다. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/src/pages/relay/LoginPage.vue | 88 +++---------------------- frontend/src/pages/relay/SignupPage.vue | 10 ++- 2 files changed, 18 insertions(+), 80 deletions(-) diff --git a/frontend/src/pages/relay/LoginPage.vue b/frontend/src/pages/relay/LoginPage.vue index 8e8ded6..d3f5098 100644 --- a/frontend/src/pages/relay/LoginPage.vue +++ b/frontend/src/pages/relay/LoginPage.vue @@ -16,12 +16,6 @@ const showPassword = ref(false) const keepLogin = ref(true) const submitting = ref(false) -// 미인증 계정 로그인 시도 시(서버 403) 인라인 재발송 안내 노출 -const needsVerify = ref(false) -const pendingEmail = ref('') -const resending = ref(false) -const resendDone = ref(false) - // 상단 안내 배너 — 이메일 인증(/login?verified=1|0) 또는 비밀번호 재설정 완료(/login?reset=1) const verifyBanner = computed<{ ok: boolean; text: string } | null>(() => { if (route.query.reset === '1') @@ -40,7 +34,6 @@ const verifyBanner = computed<{ ok: boolean; text: string } | null>(() => { async function onLogin() { if (submitting.value) return submitting.value = true - needsVerify.value = false try { await authStore.login({ email: email.value.trim(), @@ -49,32 +42,23 @@ async function onLogin() { }) await router.push('/projects') } catch (err) { - // 미인증 계정은 서버가 403 으로 응답 → 인라인 재발송 안내 노출(메시지 토스트는 인터셉터가 처리) + // 미인증 계정(서버 403) → 인증 메일을 즉시 발송하고 '발송 완료' 화면으로 이동 const status = (err as { response?: { status?: number } })?.response?.status if (status === 403) { - pendingEmail.value = email.value.trim() - resendDone.value = false - needsVerify.value = true + const addr = email.value.trim() + try { + await authStore.resendVerification(addr) + } catch { + // 재발송 실패는 API 인터셉터가 전역 처리 + } + await router.push({ path: '/signup', query: { sent: addr } }) } + // 그 외(자격 불일치 등) 에러 메시지는 API 인터셉터에서 전역 처리됨 } finally { submitting.value = false } } -// 인증 메일 재발송 — 미인증 로그인 안내에서 호출(존재 여부는 서버가 노출하지 않음) -async function resendVerify() { - if (resending.value || !pendingEmail.value) return - resending.value = true - try { - await authStore.resendVerification(pendingEmail.value) - resendDone.value = true - } catch { - // 에러 메시지는 API 인터셉터에서 전역 처리됨 - } finally { - resending.value = false - } -} - // 소셜 로그인 — 백엔드 OAuth 엔드포인트로 전체 페이지 이동(쿠키 기반 세션이라 새 창 X) const apiBase = import.meta.env.VITE_API_BASE_URL || '/api' function goSocial(provider: 'google' | 'kakao') { @@ -183,32 +167,6 @@ const points = [ {{ verifyBanner.text }} - -
-
- 이메일 인증이 완료되지 않았습니다. 받은 인증 메일의 링크로 가입을 완료해 주세요. -
- -
- 인증 메일을 다시 보냈습니다. 메일함을 확인해 주세요. -
-
-