route.ts 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. import { NextRequest, NextResponse } from 'next/server';
  2. import { ResultDto } from '@/types/response/common';
  3. import { LoginResponse } from '@/types/response/auth';
  4. import { fetchJson } from '@/lib/utils/server';
  5. export async function POST(request: NextRequest)
  6. {
  7. // Google redirect 모드는 form data로 credential을 전송
  8. const formData = await request.formData();
  9. const credential = formData.get('credential') as string;
  10. if (!credential) {
  11. const url = new URL('/login', request.url);
  12. url.searchParams.set('error', 'Google 인증 정보가 없습니다.');
  13. return NextResponse.redirect(url);
  14. }
  15. // 백엔드 google-login API 호출
  16. const res: ResultDto = await fetchJson('/api/auth/google-login', {
  17. method: 'POST',
  18. body: JSON.stringify({ credential })
  19. });
  20. if (res.success && res.data) {
  21. const data = res.data as LoginResponse;
  22. const response = NextResponse.redirect(new URL('/auth/login/google/complete', request.url));
  23. const cookieOptions = { httpOnly: true, path: '/' };
  24. response.cookies.set('accessToken', data.accessToken, cookieOptions);
  25. response.cookies.set('refreshToken', data.refreshToken, cookieOptions);
  26. return response;
  27. }
  28. // 실패 시 로그인 페이지로 리다이렉트
  29. const url = new URL('/login', request.url);
  30. url.searchParams.set('error', res.message || 'Google 로그인에 실패했습니다.');
  31. return NextResponse.redirect(url);
  32. }