Vérification d'e-mails avec Supabase
Supabase permet d'intercepter les événements d'authentification par des Auth Hooks. Ce tutoriel crée une Edge Function qui appelle Mailbeam avant que Supabase ne crée un utilisateur, ce qui bloque les adresses jetables et invalides au niveau de la couche d'identité.
Prérequis
- Un projet Supabase (avec la CLI installée)
- Une clé d'API Mailbeam (inscription gratuite)
Créer l'Edge Function
supabase functions new verify-email// supabase/functions/verify-email/index.ts
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";
const MAILBEAM_KEY = Deno.env.get("MAILBEAM_KEY")!;
const MIN_SCORE = 60;
serve(async (req) => {
const payload = await req.json();
// Le payload de l'Auth Hook porte les données utilisateur dans payload.user
const email = payload?.user?.email ?? payload?.email;
if (!email) {
return new Response(JSON.stringify({ decision: "reject" }), {
headers: { "Content-Type": "application/json" },
});
}
try {
const response = await fetch("https://api.mailbeam.dev/v1/verify", {
method: "POST",
headers: {
Authorization: `Bearer ${MAILBEAM_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ email }),
signal: AbortSignal.timeout(5000),
});
if (!response.ok) throw new Error(`HTTP ${response.status}`);
const { valid, score, reason } = await response.json();
if (!valid || score < MIN_SCORE) {
const message =
reason === "disposable_domain"
? "Merci d'utiliser une adresse e-mail permanente."
: "Merci de fournir une adresse e-mail valide et joignable.";
return new Response(
JSON.stringify({ decision: "reject", message }),
{ status: 200, headers: { "Content-Type": "application/json" } }
);
}
} catch (err) {
// Échec permissif — ne rejette pas sur une erreur de l'API Mailbeam
console.error("Erreur Mailbeam :", err);
}
return new Response(
JSON.stringify({ decision: "continue" }),
{ status: 200, headers: { "Content-Type": "application/json" } }
);
});Définir la variable d'environnement
supabase secrets set MAILBEAM_KEY=mb_live_xxxxxxxxxxxxxxxxxxxxDéployer et brancher sur l'Auth Hook
supabase functions deploy verify-emailDans le tableau de bord Supabase → Authentication → Hooks :
- Activez Before User Creation
- Sélectionnez votre Edge Function
verify-email
Tester en local
supabase start
supabase functions serve verify-email --env-file .env.local
# Test avec curl
curl -X POST http://localhost:54321/functions/v1/verify-email \
-H "Content-Type: application/json" \
-d '{"user": {"email": "temp@mailinator.com"}}'
# → {"decision":"reject","message":"Merci d'utiliser une adresse e-mail permanente."}Bonnes pratiques
- Renvoyez toujours
{ decision: "continue" }dans le bloc catch — échec permissif - Posez un
AbortSignal.timeout(5000)pour éviter que la fonction ne reste bloquée - Journalisez les erreurs dans les logs de fonction Supabase, pour la supervision