Backend (FastAPI + Oracle ADB), Frontend (Next.js), daemon worker. Features: channel/video/restaurant management, semantic search, Google OAuth, user reviews. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
41 lines
1.1 KiB
Python
41 lines
1.1 KiB
Python
"""Auth API routes — Google SSO login and user info."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter, Depends, HTTPException
|
|
from pydantic import BaseModel
|
|
|
|
from core.auth import verify_google_token, find_or_create_user, create_jwt
|
|
from api.deps import get_current_user
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
class GoogleLoginRequest(BaseModel):
|
|
id_token: str
|
|
|
|
|
|
@router.post("/google")
|
|
def login_google(body: GoogleLoginRequest):
|
|
"""Verify Google ID token and return JWT + user info."""
|
|
try:
|
|
google_info = verify_google_token(body.id_token)
|
|
except ValueError as e:
|
|
raise HTTPException(401, f"Invalid Google token: {e}")
|
|
|
|
user = find_or_create_user(
|
|
provider="google",
|
|
provider_id=google_info["sub"],
|
|
email=google_info.get("email"),
|
|
nickname=google_info.get("name"),
|
|
avatar_url=google_info.get("picture"),
|
|
)
|
|
access_token = create_jwt(user)
|
|
return {"access_token": access_token, "user": user}
|
|
|
|
|
|
@router.get("/me")
|
|
def get_me(current_user: dict = Depends(get_current_user)):
|
|
"""Return current authenticated user info."""
|
|
return current_user
|