""" Auth 모듈 의존성 주입 """ from fastapi import Depends, HTTPException, status from fastapi.security import HTTPAuthorizationCredentials, HTTPBearer from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.auth.models import User from app.auth.services.jwt import decode_access_token from app.database.session import get_session security = HTTPBearer(auto_error=False) async def get_current_user( credentials: HTTPAuthorizationCredentials | None = Depends(security), session: AsyncSession = Depends(get_session), ) -> User: """현재 로그인한 사용자 반환 (필수 인증)""" if credentials is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="인증이 필요합니다", ) payload = decode_access_token(credentials.credentials) if payload is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="유효하지 않은 토큰입니다", ) user_id = payload.get("sub") if user_id is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="유효하지 않은 토큰입니다", ) result = await session.execute(select(User).where(User.id == int(user_id))) user = result.scalar_one_or_none() if user is None: raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, detail="사용자를 찾을 수 없습니다", ) return user async def get_current_user_optional( credentials: HTTPAuthorizationCredentials | None = Depends(security), session: AsyncSession = Depends(get_session), ) -> User | None: """현재 로그인한 사용자 반환 (선택적 인증)""" if credentials is None: return None payload = decode_access_token(credentials.credentials) if payload is None: return None user_id = payload.get("sub") if user_id is None: return None result = await session.execute(select(User).where(User.id == int(user_id))) return result.scalar_one_or_none()