35 lines
1.3 KiB
JavaScript
35 lines
1.3 KiB
JavaScript
const VERIFY_URL = "https://challenges.cloudflare.com/turnstile/v0/siteverify";
|
|
|
|
// Vérifie le jeton Cloudflare Turnstile envoyé par le front dans
|
|
// `captchaToken`. Sans TURNSTILE_SECRET_KEY, la vérification est ignorée
|
|
// (même logique que googleEnabled dans config/passport.js).
|
|
// À placer AVANT validate() : zod retire les clés inconnues de req.body.
|
|
const verifyCaptcha = async (req, res, next) => {
|
|
const secret = process.env.TURNSTILE_SECRET_KEY;
|
|
if (!secret) return next();
|
|
|
|
const token = req.body?.captchaToken;
|
|
if (!token) {
|
|
return res.status(400).json({ message: "Veuillez confirmer que vous n'êtes pas un robot." });
|
|
}
|
|
|
|
try {
|
|
const response = await fetch(VERIFY_URL, {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ secret, response: token, remoteip: req.ip }),
|
|
});
|
|
const data = await response.json();
|
|
|
|
if (!data.success) {
|
|
return res.status(400).json({ message: "Vérification anti-robot échouée, veuillez réessayer." });
|
|
}
|
|
return next();
|
|
} catch (error) {
|
|
console.error("Erreur vérification Turnstile :", error);
|
|
return res.status(503).json({ message: "Service de vérification indisponible, réessayez plus tard." });
|
|
}
|
|
};
|
|
|
|
module.exports = verifyCaptcha;
|