# decorators.py from functools import wraps from flask import session, redirect, url_for, flash, request, jsonify # <-- AJOUT de request, jsonify # Import nécessaire pour le décorateur API (Importation paresseuse pour éviter les problèmes d'importation circulaire) import auth_backend def login_required(f): """ Décorateur pour les routes nécessitant une connexion (Web UI). """ @wraps(f) def decorated_function(*args, **kwargs): # Vérifie si l'ID utilisateur est dans la session if session.get('user_id') is None: flash("Vous devez être connecté pour accéder à cette page.", "error") # Rediriger vers la route de connexion (qui est dans user_bp) return redirect(url_for('user_bp.connexion')) return f(*args, **kwargs) return decorated_function def api_key_required(f): """ Décorateur pour les routes d'API nécessitant une clé API valide. Récupère la clé API de l'en-tête 'X-API-Key' ou du paramètre de requête 'api_key'. Injecte les données de l'utilisateur principal (client) dans la fonction décorée. """ @wraps(f) def decorated_function(*args, **kwargs): # 1. Récupérer la clé depuis l'en-tête ou les paramètres de requête api_key = request.headers.get('X-API-Key') if not api_key: api_key = request.args.get('api_key') if not api_key: return jsonify({ "message": "Authentification requise. Clé API manquante dans l'en-tête X-API-Key ou le paramètre api_key.", "status": "Unauthorized" }), 401 # 2. Valider la clé et récupérer l'utilisateur principal # NOTE: Utilise l'import paresseux 'auth_backend.get_client_user_by_api_key' client_user = auth_backend.get_client_user_by_api_key(api_key) if not client_user: return jsonify({ "message": "Clé API invalide ou non reconnue.", "status": "Forbidden" }), 403 # 3. Injecter les données de l'utilisateur principal (le client) kwargs['client_user'] = client_user return f(*args, **kwargs) return decorated_function