/** * Script de debug pour identifier la cause exacte de l'erreur 403 */ import 'dotenv/config'; import jwt from 'jsonwebtoken'; import { pool } from '../db.js'; const TOKEN_FROM_BROWSER = process.argv[2] || ''; async function debugToken() { console.log('🔍 DEBUG - Erreur 403 Forbidden\n'); console.log('=' .repeat(60)); // GĂ©nĂ©rer un nouveau token admin console.log('\n1ïžâƒŁ GÉNÉRATION D\'UN NOUVEAU TOKEN ADMIN\n'); const adminResult = await pool.query(` SELECT id, email, role, first_name, last_name, is_verified FROM users WHERE role = 'ADMIN' LIMIT 1 `); if (adminResult.rows.length === 0) { console.log('❌ Aucun utilisateur ADMIN trouvĂ© dans la base !'); process.exit(1); } const admin = adminResult.rows[0]; console.log('✅ Admin trouvĂ©:'); console.log(` ID: ${admin.id}`); console.log(` Email: ${admin.email}`); console.log(` Nom: ${admin.first_name} ${admin.last_name}`); console.log(` RĂŽle: ${admin.role}`); console.log(` Email vĂ©rifiĂ©: ${admin.is_verified ? 'Oui' : 'Non'}`); // GĂ©nĂ©rer le token const newToken = jwt.sign( { userId: admin.id }, process.env.JWT_SECRET, { expiresIn: '7d' } ); console.log(`\n✅ Nouveau token gĂ©nĂ©rĂ© (expire dans 7 jours):`); console.log(`\n${newToken}\n`); // Tester le token console.log('=' .repeat(60)); console.log('\n2ïžâƒŁ TEST DU NOUVEAU TOKEN\n'); try { const decoded = jwt.verify(newToken, process.env.JWT_SECRET); console.log('✅ Token valide et dĂ©codĂ©:'); console.log(` User ID: ${decoded.userId}`); console.log(` Émis Ă : ${new Date(decoded.iat * 1000).toLocaleString('fr-FR')}`); console.log(` Expire Ă : ${new Date(decoded.exp * 1000).toLocaleString('fr-FR')}`); // VĂ©rifier l'utilisateur dans la DB const userCheck = await pool.query( 'SELECT id, email, role FROM users WHERE id = $1', [decoded.userId] ); if (userCheck.rows.length > 0) { const user = userCheck.rows[0]; console.log('\n✅ Utilisateur trouvĂ© dans la base:'); console.log(` ID: ${user.id}`); console.log(` Email: ${user.email}`); console.log(` RĂŽle: ${user.role}`); if (user.role === 'ADMIN') { console.log('\n✅ L\'utilisateur a bien le rĂŽle ADMIN'); } else { console.log(`\n❌ PROBLÈME: L\'utilisateur a le rĂŽle "${user.role}" au lieu de "ADMIN"`); } } else { console.log('\n❌ PROBLÈME: Utilisateur non trouvĂ© dans la base'); } } catch (error) { console.log('❌ Erreur lors de la vĂ©rification du token:'); console.log(` ${error.message}`); } // Si un token du navigateur est fourni, le tester aussi if (TOKEN_FROM_BROWSER) { console.log('=' .repeat(60)); console.log('\n3ïžâƒŁ TEST DU TOKEN DU NAVIGATEUR\n'); console.log(`Token reçu: ${TOKEN_FROM_BROWSER.substring(0, 50)}...`); try { const decoded = jwt.verify(TOKEN_FROM_BROWSER, process.env.JWT_SECRET); console.log('\n✅ Token du navigateur valide et dĂ©codĂ©:'); console.log(` User ID: ${decoded.userId}`); console.log(` Émis Ă : ${new Date(decoded.iat * 1000).toLocaleString('fr-FR')}`); console.log(` Expire Ă : ${new Date(decoded.exp * 1000).toLocaleString('fr-FR')}`); // VĂ©rifier l'utilisateur const userCheck = await pool.query( 'SELECT id, email, role FROM users WHERE id = $1', [decoded.userId] ); if (userCheck.rows.length > 0) { const user = userCheck.rows[0]; console.log('\n✅ Utilisateur trouvĂ©:'); console.log(` Email: ${user.email}`); console.log(` RĂŽle: ${user.role}`); if (user.role === 'ADMIN') { console.log('\n✅ Le token du navigateur est VALIDE et l\'utilisateur est ADMIN'); console.log('\n🔍 CONCLUSION: Le problĂšme n\'est PAS le token !'); console.log(' VĂ©rifiez plutĂŽt:'); console.log(' - Que le header Authorization est bien envoyĂ© depuis le frontend'); console.log(' - Que le format est bien "Bearer TOKEN"'); console.log(' - Les logs du serveur backend pour plus de dĂ©tails'); } else { console.log(`\n❌ PROBLÈME TROUVÉ: L\'utilisateur a le rĂŽle "${user.role}"`); console.log(` Il faut un utilisateur ADMIN pour accĂ©der aux routes /api/draw/*`); } } else { console.log('\n❌ PROBLÈME TROUVÉ: L\'utilisateur du token n\'existe plus dans la base'); } } catch (error) { console.log('\n❌ PROBLÈME TROUVÉ avec le token du navigateur:'); if (error.name === 'TokenExpiredError') { console.log(' Token expirĂ© !'); console.log(` ExpirĂ© le: ${new Date(error.expiredAt).toLocaleString('fr-FR')}`); console.log('\n 💡 SOLUTION: Utiliser le nouveau token gĂ©nĂ©rĂ© ci-dessus'); } else if (error.name === 'JsonWebTokenError') { console.log(` Token invalide: ${error.message}`); console.log('\n 💡 SOLUTION: Utiliser le nouveau token gĂ©nĂ©rĂ© ci-dessus'); } else { console.log(` ${error.message}`); } } } console.log('\n' + '=' .repeat(60)); console.log('\n📋 INSTRUCTIONS POUR METTRE À JOUR LE TOKEN\n'); console.log('1. Ouvrir la console du navigateur (F12)'); console.log('2. Copier-coller ce code:'); console.log('\nlocalStorage.setItem(\'token\', \'' + newToken + '\');'); console.log('location.reload();\n'); console.log('3. Appuyer sur EntrĂ©e'); console.log('4. La page va se recharger avec le nouveau token\n'); await pool.end(); } debugToken().catch(err => { console.error('❌ Erreur:', err); process.exit(1); });