1proxy / app /dependencies.py
Paijo
update app/dependencies.py
cdd38c8 verified
raw
history blame
1.65 kB
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