2nzi's picture
update app
16c970a verified
from fastapi import Depends, HTTPException, status
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from firebase_admin import auth
from .firebase import db
import time
security = HTTPBearer()
def get_user(credentials: HTTPAuthorizationCredentials = Depends(security)):
if not credentials:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Bearer authentication required"
)
try:
# Utiliser une valeur valide pour clock_skew_seconds (entre 0 et 60)
decoded_token = auth.verify_id_token(
credentials.credentials,
check_revoked=True,
clock_skew_seconds=60 # Valeur maximale autorisée
)
user_id = decoded_token['uid']
user_doc = db.collection('users').document(user_id).get()
if not user_doc.exists:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="User not found in Firestore"
)
user_data = user_doc.to_dict()
decoded_token['role'] = user_data.get('role', 'user_extern')
return decoded_token
except Exception as e:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=f"Invalid authentication credentials: {str(e)}"
)
def require_role(allowed_roles):
def role_checker(user_info=Depends(get_user)):
if user_info['role'] not in allowed_roles:
raise HTTPException(
status_code=status.HTTP_403_FORBIDDEN,
detail="Insufficient permissions"
)
return user_info
return role_checker