from fastapi import FastAPI, Depends, HTTPException, Header from fastapi.middleware.cors import CORSMiddleware from firebase_admin import auth, credentials, initialize_app from functools import wraps import firebase_admin import os import json from dotenv import load_dotenv # Charger les variables d'environnement load_dotenv() app = FastAPI() # Configuration CORS pour autoriser les requêtes depuis le frontend app.add_middleware( CORSMiddleware, allow_origins=[ "http://localhost:5173", "https://junsen-ai.vercel.app", # "https://huggingface.co" ], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) # Initialiser Firebase avec les credentials depuis les variables d'environnement if os.getenv('FIREBASE_CREDENTIALS'): cred_dict = json.loads(os.getenv('FIREBASE_CREDENTIALS')) cred = credentials.Certificate(cred_dict) else: # Fallback pour le développement local cred = credentials.Certificate("serviceAccountKey.json") firebase_admin.initialize_app(cred) # Middleware pour vérifier le token Firebase async def verify_token(authorization: str = Header(...)): try: token = authorization.split("Bearer ")[1] decoded_token = auth.verify_id_token(token) return decoded_token except Exception: raise HTTPException(status_code=401, detail="Token invalide") # Décorateur pour restreindre l'accès en fonction des rôles def require_role(roles): def decorator(func): @wraps(func) async def wrapper(*args, token=Depends(verify_token), **kwargs): if token.get("role") not in roles: raise HTTPException(status_code=403, detail="Accès non autorisé") return await func(*args, **kwargs) return wrapper return decorator # Routes sécurisées @app.get("/api/protected/admin") @require_role(["admin"]) async def admin_only(): return {"message": "Route admin"} @app.get("/api/protected/user") @require_role(["user", "admin"]) async def user_route(): return {"message": "Route utilisateur"} # Route de test pour vérifier que le serveur fonctionne @app.get("/") async def root(): return {"message": "Backend Junsen AI opérationnel"}