route.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { LoginResponse } from '@/types/response/auth';
  3. const API_URL = process.env.API_URL;
  4. export async function POST(request: NextRequest)
  5. {
  6. // Google redirect 모드는 form data로 credential을 전송
  7. const formData = await request.formData();
  8. const credential = formData.get('credential') as string;
  9. if (!credential) {
  10. const url = new URL('/login', request.url);
  11. url.searchParams.set('error', 'Google 인증 정보가 없습니다.');
  12. return NextResponse.redirect(url);
  13. }
  14. try {
  15. // 백엔드 google-login API 직접 호출
  16. const res = await fetch(`${API_URL}/api/auth/google-login`, {
  17. method: 'POST',
  18. headers: { 'Content-Type': 'application/json', 'Accept': 'application/json' },
  19. body: JSON.stringify({ credential }),
  20. cache: 'no-store'
  21. });
  22. const json = await res.json();
  23. console.log('[Google Callback] Backend response:', res.status, JSON.stringify(json).substring(0, 200));
  24. if (json.success && json.data) {
  25. const data = json.data as LoginResponse;
  26. const response = NextResponse.redirect(new URL('/login/google/complete', request.url));
  27. const cookieOptions = { httpOnly: true, path: '/' };
  28. response.cookies.set('accessToken', data.accessToken, cookieOptions);
  29. response.cookies.set('refreshToken', data.refreshToken, cookieOptions);
  30. return response;
  31. }
  32. // 실패 시 로그인 페이지로 리다이렉트
  33. const errorUrl = new URL('/login', request.url);
  34. errorUrl.searchParams.set('error', json.message || 'Google 로그인에 실패했습니다.');
  35. return NextResponse.redirect(errorUrl);
  36. } catch (e) {
  37. console.error('[Google Callback] Error:', e);
  38. const errorUrl = new URL('/login', request.url);
  39. errorUrl.searchParams.set('error', e instanceof Error ? e.message : 'Server failure');
  40. return NextResponse.redirect(errorUrl);
  41. }
  42. }