56 lines
2.2 KiB
Python
56 lines
2.2 KiB
Python
from fastapi import APIRouter, Query, Depends
|
|
from fastapi.responses import RedirectResponse
|
|
from typing import Optional
|
|
from .dto import TokenRequest
|
|
from .service import GoogleService, get_google_service
|
|
|
|
router = APIRouter()
|
|
|
|
@router.get("/social/google/login")
|
|
async def get_google_auth_url(
|
|
return_url: str = Query(..., description="로그인 후 돌아갈 URL"),
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
):
|
|
"""Google OAuth 로그인 URL 생성"""
|
|
return await google_service.login_url(return_url)
|
|
|
|
@router.get("/social/google/callback")
|
|
async def handle_google_callback(
|
|
code: str = Query(..., description="Google에서 제공하는 인증 코드"),
|
|
state: str = Query(..., description="CSRF 보호용 state 파라미터"),
|
|
error: Optional[str] = Query(None, description="Google 인증 에러"),
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
):
|
|
"""Google OAuth 콜백 처리 후 FE로 리다이렉트"""
|
|
if error:
|
|
# 에러 시 FE 에러 페이지로
|
|
return RedirectResponse(url=f"http://localhost:3300/auth/error?error={error}")
|
|
|
|
try:
|
|
result = await google_service.callback(state, code)
|
|
temp_token_id = result["temp_token_id"]
|
|
return_url = result.get("return_url")
|
|
print(f"return_url: {return_url}")
|
|
|
|
# 성공 시 FE 성공 페이지로 temp_token_id와 함께 리다이렉트
|
|
return RedirectResponse(url=f"{return_url}?token={temp_token_id}")
|
|
|
|
except Exception as e:
|
|
# 처리 실패 시 FE 에러 페이지로
|
|
return RedirectResponse(url=f"{return_url}?message={str(e)}")
|
|
|
|
@router.get("/social/google/token/{temp_token_id}")
|
|
async def get_token_info(
|
|
temp_token_id: str,
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
):
|
|
"""임시 토큰 ID로 실제 토큰 정보 조회"""
|
|
return await google_service.get_token_info(temp_token_id)
|
|
|
|
@router.post("/youtube/channel/info")
|
|
async def get_youtube_channel_info(
|
|
req: TokenRequest,
|
|
google_service: GoogleService = Depends(get_google_service)
|
|
):
|
|
"""사용자의 YouTube 채널 정보 조회"""
|
|
return await google_service.get_all_youtube_channel_info(req.access_token, req.refresh_token) |