Spaces:
Runtime error
Runtime error
File size: 2,625 Bytes
f3997d4 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | from typing import Optional
from fastapi import Request, HTTPException, status, Depends
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from jose import JWTError, jwt
from app.config.settings import settings
from app.database.connection import get_db
from app.database.models import User
security = HTTPBearer()
def get_current_user_optional(
credentials: Optional[HTTPAuthorizationCredentials] = Depends(HTTPBearer(auto_error=False))
) -> Optional[User]:
"""
Get current user from JWT token (optional - doesn't raise error if no token).
Args:
credentials: Optional HTTP authorization credentials
Returns:
User object if authenticated, None otherwise
"""
if not credentials:
return None
try:
token = credentials.credentials
payload = jwt.decode(
token,
settings.secret_key,
algorithms=[settings.algorithm]
)
user_id: str = payload.get("sub")
if user_id is None:
return None
# Get user from database
db = next(get_db())
user = db.query(User).filter(User.id == user_id).first()
return user
except JWTError:
return None
def get_current_user(
credentials: HTTPAuthorizationCredentials = Depends(security)
) -> User:
"""
Get current user from JWT token (required - raises error if no valid token).
Args:
credentials: HTTP authorization credentials
Returns:
User object
Raises:
HTTPException: If token is invalid or user not found
"""
try:
token = credentials.credentials
payload = jwt.decode(
token,
settings.secret_key,
algorithms=[settings.algorithm]
)
user_id: str = payload.get("sub")
if user_id is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials"
)
# Get user from database
db = next(get_db())
user = db.query(User).filter(User.id == user_id).first()
if user is None:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="User not found"
)
return user
except JWTError:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials"
)
|