Spaces:
Build error
Build error
| # decorators.py | |
| from functools import wraps | |
| from flask import session, redirect, url_for, flash, request, jsonify | |
| # Import nécessaire pour le décorateur API (Importation paresseuse pour éviter les problèmes d'importation circulaire) | |
| # Assurez-vous que ce module contient bien les fonctions get_client_user_by_uuid et get_client_user_by_api_key. | |
| import auth_backend | |
| def login_required(f): | |
| def decorated_function(*args, **kwargs): | |
| if session.get('user_id') is None: | |
| flash("Vous devez être connecté pour accéder à cette page.", "error") | |
| # REDIRECTION VERS LA ROUTE DE CONNEXION DU BACKEND | |
| return redirect(url_for('web_bp.connexion_page')) | |
| 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 (pour les clients externes). | |
| ... (Reste inchangé) | |
| """ | |
| 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 | |
| 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 | |
| # NOUVEAU DÉCORATEUR : Pour les routes d'API qui doivent utiliser l'authentification par session | |
| def api_session_required(f): | |
| """ | |
| Décorateur pour les routes d'API nécessitant une session utilisateur active (Web UI via session cookie). | |
| Récupère l'ID utilisateur de la session et injecte les données de l'utilisateur dans la fonction. | |
| """ | |
| def decorated_function(*args, **kwargs): | |
| # 1. Récupérer l'ID utilisateur de la session | |
| user_uuid = session.get('user_id') | |
| if not user_uuid: | |
| # Si l'ID est manquant, on renvoie une réponse JSON 401 (standard pour une API). | |
| return jsonify({ | |
| "message": "Authentification par session requise. Utilisateur non connecté.", | |
| "status": "Unauthorized" | |
| }), 401 | |
| # 2. Récupérer l'utilisateur principal (client) à partir de son UUID | |
| # On utilise le UUID stocké dans la session | |
| client_user = auth_backend.get_client_user_by_uuid(user_uuid) | |
| if not client_user: | |
| # L'utilisateur existe en session mais pas/plus dans la base. | |
| session.pop('user_id', None) # Vider la session | |
| return jsonify({ | |
| "message": "Session invalide ou utilisateur non reconnu.", | |
| "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 |