/* Page de connexion : formulaire avec authentification JWT + captcha anti-bot */ import { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../../context/useAuth'; import styles from './Login.module.css'; /* Génère deux entiers aléatoires pour le captcha additif */ function genererCaptcha() { return { x: Math.floor(Math.random() * 10) + 1, y: Math.floor(Math.random() * 10) + 1, }; } export default function Login() { const [identifiant, setIdentifiant] = useState(''); const [motDePasse, setMotDePasse] = useState(''); const [captcha, setCaptcha] = useState(() => genererCaptcha()); const [reponseCaptcha, setReponseCaptcha] = useState(''); const [loading, setLoading] = useState(false); const [erreur, setErreur] = useState(''); const { login } = useAuth(); const navigate = useNavigate(); async function handleSubmit(e) { e.preventDefault(); setErreur(''); /* Vérification anti-bot du captcha avant tout appel réseau */ if (parseInt(reponseCaptcha, 10) !== captcha.x + captcha.y) { setErreur('Réponse au captcha incorrecte.'); setCaptcha(genererCaptcha()); setReponseCaptcha(''); return; } setLoading(true); try { await login(identifiant, motDePasse); navigate('/dashboard'); } catch (err) { /* Message générique en cas d'identifiants invalides ou d'erreur serveur */ setErreur(err.message === 'Identifiants invalides' ? 'Identifiants invalides' : (err.message || 'Identifiants invalides')); setCaptcha(genererCaptcha()); setReponseCaptcha(''); } finally { setLoading(false); } } return (
by XEFI