Files
SQLBot/backend/common/core/deps.py
T

49 lines
1.7 KiB
Python

from typing import Annotated
import jwt
from fastapi import Depends, HTTPException, status
# from fastapi.security import OAuth2PasswordBearer
from jwt.exceptions import InvalidTokenError
from pydantic import BaseModel, ValidationError
from sqlmodel import Session, select
from common.core.schemas import TokenPayload, XOAuth2PasswordBearer
from common.core import security
from common.core.config import settings
from common.core.db import get_session
from apps.system.models.user import sys_user, user_grid
reusable_oauth2 = XOAuth2PasswordBearer(
tokenUrl=f"{settings.API_V1_STR}/login/access-token"
)
SessionDep = Annotated[Session, Depends(get_session)]
TokenDep = Annotated[str, Depends(reusable_oauth2)]
async def get_current_user(session: SessionDep, token: TokenDep) -> sys_user:
try:
payload = jwt.decode(
token, settings.SECRET_KEY, algorithms=[security.ALGORITHM]
)
token_data = TokenPayload(**payload)
except (InvalidTokenError, ValidationError):
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Could not validate credentials",
)
statement = select(user_grid.id, user_grid.account, user_grid.oid, user_grid.password).where(user_grid.id == token_data.id)
session_user = session.exec(statement).first()
if not session_user:
raise HTTPException(status_code=404, detail="User not found")
user = sys_user.model_validate(session_user)
if not user:
raise HTTPException(status_code=404, detail="User not found")
""" if not user.is_active:
raise HTTPException(status_code=400, detail="Inactive user") """
return user
CurrentUser = Annotated[sys_user, Depends(get_current_user)]