todo-fastapi / auth /jwt.py
MuhammedSuhaib's picture
Deployment via uv
cdaf146 verified
Raw
History Blame Contribute Delete
1.58 kB
import logging
from fastapi import Depends, HTTPException
from fastapi.security import HTTPBearer
from sqlmodel import Session
from database import get_session
import sqlalchemy
from datetime import datetime, timezone
logger = logging.getLogger(__name__)
security = HTTPBearer()
def get_current_user_id(
creds = Depends(security),
db: Session = Depends(get_session)
) -> str:
token = creds.credentials
try:
# We query the session table directly. Better Auth stores tokens as-is.
# userId and expiresAt are standard Better Auth columns.
query = sqlalchemy.text('SELECT "userId", "expiresAt" FROM "session" WHERE "token" = :t')
result = db.execute(query, {"t": token}).fetchone()
if not result:
logger.warning(f"Invalid session token attempted: {token[:10]}")
raise HTTPException(status_code=401, detail="Invalid session")
user_id, expires_at = result
# Check if the session has expired
# Ensure timezone comparison is consistent
if expires_at.replace(tzinfo=timezone.utc) < datetime.now(timezone.utc):
logger.warning(f"Session expired for user: {user_id}")
raise HTTPException(status_code=401, detail="Session expired")
logger.info(f"User {user_id} authenticated successfully")
return str(user_id)
except HTTPException:
raise
except Exception as e:
logger.error(f"Auth System Error: {str(e)}")
raise HTTPException(status_code=401, detail="Internal authentication failure")