"use client"; import { useState } from "react"; import { Shield, ShieldOff, ShieldCheck, Copy, Smartphone } from "lucide-react"; import Button from "../ui/Button"; import Modal from "../ui/Modal"; import toast from "react-hot-toast"; interface TwoFactorSetupProps { enabled: boolean; onStatusChange: () => void; } export default function TwoFactorSetup({ enabled, onStatusChange }: TwoFactorSetupProps) { const [qrCode, setQrCode] = useState(null); const [secret, setSecret] = useState(null); const [token, setToken] = useState(""); const [loading, setLoading] = useState(false); const [step, setStep] = useState<"idle" | "setup" | "verify">("idle"); const [confirmDisable, setConfirmDisable] = useState(false); const startSetup = async () => { setLoading(true); try { const res = await fetch("/api/auth/2fa/setup", { method: "POST" }); if (res.ok) { const data = await res.json(); setQrCode(data.qrCodeUrl); setSecret(data.secret); setStep("setup"); } else toast.error("Impossible de démarrer la configuration"); } catch { toast.error("Erreur réseau"); } setLoading(false); }; const verifyAndEnable = async () => { setLoading(true); try { const res = await fetch("/api/auth/2fa/verify", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ token, enable: true }), }); if (res.ok) { toast.success("Authentification à deux facteurs activée"); setStep("idle"); setQrCode(null); setToken(""); onStatusChange(); } else { const data = await res.json(); toast.error(data.error || "Code invalide"); } } catch { toast.error("Erreur réseau"); } setLoading(false); }; const disable2FA = async () => { setLoading(true); const res = await fetch("/api/auth/2fa/disable", { method: "POST" }); setLoading(false); setConfirmDisable(false); if (res.ok) { toast.success("2FA désactivée"); onStatusChange(); } else toast.error("Erreur"); }; return (
{enabled ? : }

Authentification à deux facteurs

{enabled ? "Activée" : "Désactivée"}

{enabled ? "Un code temporaire est demandé à chaque connexion." : "Ajoutez un code temporaire (TOTP) en plus de votre mot de passe."}

{step === "idle" && ( enabled ? ( ) : ( ) )}
{step === "setup" && qrCode && (
QR Code 2FA
  1. Ouvrez votre application d'authentification (Google Authenticator, Authy, 1Password…).
  2. Scannez le QR code ou saisissez la clé manuelle.
  3. Entrez le code à 6 chiffres pour confirmer.
{secret && ( )}
)} {step === "verify" && (

Entrez le code à 6 chiffres affiché dans votre application.

setToken(e.target.value.replace(/\D/g, "").slice(0, 6))} placeholder="000000" maxLength={6} className="field h-14 text-center text-2xl tracking-[0.4em] font-mono" autoFocus autoComplete="one-time-code" />
)} setConfirmDisable(false)} title="Désactiver la 2FA ?" description="Votre compte ne sera plus protégé que par votre mot de passe." footer={ <> } >

Vous pourrez la réactiver à tout moment depuis cette page.

); }