57 lines
2.3 KiB
Python
57 lines
2.3 KiB
Python
from fastapi import APIRouter, Depends, Query, Request
|
|
from fastapi.responses import RedirectResponse
|
|
from typing import Optional
|
|
|
|
from app.dependencies import get_google_service
|
|
from app.presentation.schemas.social.google_schema import GoogleTokenResponse, GoogleCallbackResponse, GoogleHealthResponse
|
|
from app.infra.google.service import GoogleService
|
|
from app.shared.decorator.response_wrapper import response_wrapper
|
|
|
|
FRONTEND_BASE_URL = "http://localhost:3300"
|
|
|
|
router = APIRouter(prefix="/social", tags=["social"])
|
|
|
|
@router.get("/google/login")
|
|
async def google_login(
|
|
request: Request,
|
|
return_url: Optional[str] = Query(None, description="로그인 후 돌아갈 URL"),
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
):
|
|
"""Google OAuth 로그인 시작"""
|
|
return await google_service.get_login_url(return_url, request)
|
|
|
|
@router.get("/google/callback")
|
|
async def google_callback(
|
|
request: Request,
|
|
error: Optional[str] = Query(None, description="Google OAuth 에러"),
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
):
|
|
"""Google OAuth 콜백 처리"""
|
|
if error:
|
|
error_url = f"{FRONTEND_BASE_URL}/auth/error?error={error}"
|
|
return RedirectResponse(url=error_url)
|
|
|
|
try:
|
|
result = await google_service.handle_callback(request)
|
|
temp_token_id = result.temp_token_id
|
|
return_url = result.return_url or f"{FRONTEND_BASE_URL}/auth/success"
|
|
|
|
# return_url에 토큰 정보 추가
|
|
separator = "&" if "?" in return_url else "?"
|
|
redirect_url = f"{return_url}{separator}token={temp_token_id}&auth_success=true"
|
|
|
|
print(f"🔄 Google OAuth 콜백 완료 - 리다이렉트: {redirect_url}")
|
|
return RedirectResponse(url=redirect_url)
|
|
|
|
except Exception as e:
|
|
print(f"❌ Google OAuth 콜백 에러: {e}")
|
|
error_url = f"{FRONTEND_BASE_URL}/auth/error?message={str(e)}"
|
|
return RedirectResponse(url=error_url)
|
|
|
|
@router.get("/google/token/{temp_token_id}")
|
|
async def get_google_token_info(
|
|
temp_token_id: str,
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
) -> GoogleTokenResponse:
|
|
"""임시 토큰 ID로 Google 토큰 정보 조회"""
|
|
return await google_service.get_token_by_temp_id(temp_token_id) |