diff --git a/app/login/page.tsx b/app/login/page.tsx index 1c5a46e..f3401cf 100644 --- a/app/login/page.tsx +++ b/app/login/page.tsx @@ -4,17 +4,34 @@ import { auth, signIn } from "@/lib/auth"; import { Button } from "@/components/ui/button"; type LoginPageProps = { - searchParams: Promise<{ callbackUrl?: string }>; + searchParams: Promise<{ callbackUrl?: string; error?: string }>; }; +function getAuthErrorMessage(error?: string) { + switch (error) { + case "AccessDenied": + return "SNU 구글 계정이 아니거나 이메일 인증이 완료되지 않아 로그인할 수 없습니다."; + case "Configuration": + return "서버의 Google 로그인 설정 또는 외부 연결 상태를 확인해야 합니다."; + case "OAuthCallback": + case "OAuthSignin": + return "Google 로그인 처리 중 문제가 발생했습니다. 잠시 후 다시 시도하세요."; + case undefined: + return null; + default: + return "로그인에 실패했습니다. 다시 시도해도 반복되면 서버 로그를 확인하세요."; + } +} + export default async function LoginPage({ searchParams }: LoginPageProps) { const session = await auth(); if (session?.user) { redirect(session.user.approved ? "/" : "/pending"); } - const { callbackUrl } = await searchParams; + const { callbackUrl, error } = await searchParams; const callback = callbackUrl ?? "/"; + const errorMessage = getAuthErrorMessage(error); async function signInWithGoogle() { "use server"; @@ -32,6 +49,12 @@ export default async function LoginPage({ searchParams }: LoginPageProps) {

+ {errorMessage ? ( +
+ {errorMessage} +
+ ) : null} +