Files
rpa_vision_v3/fix_auth_complete.py
Dom a27b74cf22 v1.0 - Version stable: multi-PC, détection UI-DETR-1, 3 modes exécution
- Frontend v4 accessible sur réseau local (192.168.1.40)
- Ports ouverts: 3002 (frontend), 5001 (backend), 5004 (dashboard)
- Ollama GPU fonctionnel
- Self-healing interactif
- Dashboard confiance

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-29 11:23:51 +01:00

254 lines
8.8 KiB
Python

#!/usr/bin/env python3
"""
Solution complète et définitive du problème d'authentification.
Deux approches possibles :
1. Utiliser le token qui fonctionne avec le serveur actuel
2. Redémarrer le serveur avec les bons tokens
"""
import os
import sys
import requests
import subprocess
from pathlib import Path
def check_server_status():
"""Vérifie si le serveur est en cours d'exécution"""
try:
response = requests.get("http://localhost:8000/health", timeout=5)
return response.status_code == 200
except:
return False
def test_token_with_server(token):
"""Teste un token avec le serveur"""
try:
response = requests.get(
"http://localhost:8000/api/traces/status",
headers={"Authorization": f"Bearer {token}"},
timeout=5
)
return response.status_code == 200
except:
return False
def find_working_token():
"""Trouve le token qui fonctionne avec le serveur actuel"""
print("🔍 === RECHERCHE DU TOKEN FONCTIONNEL ===")
# Tokens à tester
test_tokens = [
"admin_token_12345", # Token hardcodé par défaut
"readonly_token_67890", # Token readonly par défaut
os.environ.get('RPA_TOKEN_ADMIN'), # Token depuis .env.local
"5a0d594404559b8a940b44d23f4ecebff3d1933fc6618eea9698aa17c287e2d9", # Token original
]
for token in test_tokens:
if not token:
continue
print(f"🧪 Test token: {token[:16]}...")
if test_token_with_server(token):
print(f"✅ Token fonctionnel trouvé: {token[:16]}...")
return token
else:
print(f"❌ Token rejeté")
return None
def apply_solution_1_use_working_token():
"""Solution 1: Utiliser le token qui fonctionne"""
print("\n🔧 === SOLUTION 1: UTILISER LE TOKEN FONCTIONNEL ===")
working_token = find_working_token()
if not working_token:
print("❌ Aucun token fonctionnel trouvé")
return False
# Modifier .env.local pour utiliser le token fonctionnel
env_path = Path(".env.local")
if not env_path.exists():
print("❌ Fichier .env.local non trouvé")
return False
# Lire le fichier
with open(env_path, 'r') as f:
lines = f.readlines()
# Modifier la ligne RPA_TOKEN_ADMIN
modified = False
for i, line in enumerate(lines):
if line.strip().startswith('RPA_TOKEN_ADMIN='):
old_token = line.strip().split('=', 1)[1]
lines[i] = f"RPA_TOKEN_ADMIN={working_token}\\n"
print(f"✓ Token modifié dans .env.local:")
print(f" Ancien: {old_token[:16]}...")
print(f" Nouveau: {working_token[:16]}...")
modified = True
break
if not modified:
print("❌ Ligne RPA_TOKEN_ADMIN non trouvée dans .env.local")
return False
# Sauvegarder
with open(env_path, 'w') as f:
f.writelines(lines)
# Mettre à jour la variable d'environnement actuelle
os.environ['RPA_TOKEN_ADMIN'] = working_token
print("✅ Solution 1 appliquée avec succès")
return True
def apply_solution_2_restart_server():
"""Solution 2: Redémarrer le serveur avec les bons tokens"""
print("\n🔧 === SOLUTION 2: REDÉMARRER LE SERVEUR ===")
if not check_server_status():
print("❌ Serveur non accessible, impossible de le redémarrer")
return False
print("⚠️ Cette solution nécessite d'arrêter et redémarrer le serveur")
print(" Cela interrompra temporairement le service")
# Demander confirmation (pour un script automatique, on skip)
print("🔄 Redémarrage automatique du serveur...")
try:
# Arrêter le serveur actuel
print("🛑 Arrêt du serveur actuel...")
subprocess.run(["pkill", "-f", "api_upload.py"], check=False)
# Attendre un peu
import time
time.sleep(2)
# Redémarrer avec les variables d'environnement
print("🚀 Redémarrage du serveur avec .env.local...")
# Charger .env.local
env_path = Path(".env.local")
if env_path.exists():
with open(env_path, 'r') as f:
for line in f:
line = line.strip()
if line and not line.startswith('#') and '=' in line:
key, value = line.split('=', 1)
os.environ[key.strip()] = value.strip()
# Démarrer le serveur en arrière-plan
subprocess.Popen([
"python3", "api_upload.py"
], cwd="server", env=os.environ.copy())
# Attendre que le serveur démarre
print("⏳ Attente du démarrage du serveur...")
for i in range(10):
time.sleep(1)
if check_server_status():
print("✅ Serveur redémarré avec succès")
# Tester avec le token original
original_token = os.environ.get('RPA_TOKEN_ADMIN')
if original_token and test_token_with_server(original_token):
print("✅ Token original maintenant accepté par le serveur")
return True
else:
print("❌ Token original toujours rejeté")
return False
print("❌ Serveur n'a pas démarré dans les temps")
return False
except Exception as e:
print(f"❌ Erreur lors du redémarrage: {e}")
return False
def test_final_solution():
"""Test final de la solution appliquée"""
print("\n🧪 === TEST FINAL ===")
token = os.environ.get('RPA_TOKEN_ADMIN')
if not token:
print("❌ Token RPA_TOKEN_ADMIN non disponible")
return False
print(f"🔑 Test avec token: {token[:16]}...")
if test_token_with_server(token):
print("✅ Authentification réussie!")
# Test d'upload simulé
try:
test_data = b"test upload data"
response = requests.post(
"http://localhost:8000/api/traces/upload",
headers={
"Authorization": f"Bearer {token}",
"Content-Type": "application/octet-stream"
},
data=test_data,
timeout=10
)
if response.status_code == 200:
print("✅ Test d'upload réussi!")
return True
else:
print(f"❌ Test d'upload échoué: {response.status_code}")
print(f" Réponse: {response.text}")
return False
except Exception as e:
print(f"❌ Erreur test d'upload: {e}")
return False
else:
print("❌ Authentification échouée")
return False
def main():
"""Solution complète"""
print("🎯 === SOLUTION COMPLÈTE AUTHENTIFICATION AGENT V0 ===")
if not check_server_status():
print("❌ Serveur non accessible sur http://localhost:8000")
print(" Veuillez démarrer le serveur avant d'exécuter ce script")
return False
print("✅ Serveur accessible")
# Essayer d'abord la solution 1 (plus simple)
print("\\n🎯 Tentative de la Solution 1 (utiliser token fonctionnel)...")
if apply_solution_1_use_working_token():
if test_final_solution():
print("\\n🎉 === PROBLÈME RÉSOLU AVEC SOLUTION 1 ===")
print("✅ L'agent v0 utilisera maintenant le token fonctionnel")
print("✅ Les uploads devraient fonctionner sans erreur 401")
return True
else:
print("❌ Solution 1 appliquée mais test final échoué")
# Si solution 1 échoue, essayer solution 2
print("\\n🎯 Tentative de la Solution 2 (redémarrer serveur)...")
if apply_solution_2_restart_server():
if test_final_solution():
print("\\n🎉 === PROBLÈME RÉSOLU AVEC SOLUTION 2 ===")
print("✅ Le serveur utilise maintenant les tokens de .env.local")
print("✅ L'agent v0 peut s'authentifier avec le token original")
return True
else:
print("❌ Solution 2 appliquée mais test final échoué")
print("\\n❌ === ÉCHEC DES DEUX SOLUTIONS ===")
print("🔧 ACTIONS MANUELLES RECOMMANDÉES:")
print("1. Vérifier que le serveur fonctionne: curl http://localhost:8000/health")
print("2. Vérifier les logs du serveur pour les erreurs d'authentification")
print("3. Redémarrer manuellement le serveur avec: cd server && python3 api_upload.py")
return False
if __name__ == "__main__":
success = main()
exit(0 if success else 1)