1proxy / app /dependencies.py
paijo77's picture
update app/dependencies.py
cdd38c8 verified
from fastapi import Depends, HTTPException, status, Cookie
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from typing import Optional
from app.database import get_db
from app.db_models import User
from app.auth import verify_token
security = HTTPBearer(auto_error=False)
async def get_current_user(
credentials: Optional[HTTPAuthorizationCredentials] = Depends(security),
token: Optional[str] = Cookie(None, alias="access_token"),
session: AsyncSession = Depends(get_db),
) -> Optional[User]:
jwt_token = None
if credentials:
jwt_token = credentials.credentials
elif token:
jwt_token = token
if not jwt_token:
return None
payload = verify_token(jwt_token)
if not payload:
return None
user_id = payload.get("sub")
if not user_id:
return None
result = await session.execute(select(User).where(User.id == int(user_id)))
user = result.scalar_one_or_none()
return user
async def require_user(
current_user: Optional[User] = Depends(get_current_user),
) -> User:
if not current_user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED, detail="Not authenticated"
)
return current_user
async def require_admin(current_user: User = Depends(require_user)) -> User:
if current_user.role != "admin":
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN, detail="Admin access required"
)
return current_user