Verifica delle email con Supabase
Supabase permette di intercettare gli eventi di autenticazione con gli Auth Hooks. Questo tutorial crea una Edge Function che chiama Mailbeam prima che Supabase crei un nuovo utente, bloccando le email usa e getta e non valide nello strato di identità.
Prerequisiti
- Un progetto Supabase (con la CLI installata)
- Una chiave API di Mailbeam (iscriviti gratis)
Crea la 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();
// Il payload dell'Auth Hook porta i dati dell'utente in 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"
? "Usa un indirizzo email permanente."
: "Inserisci un indirizzo email valido e raggiungibile.";
return new Response(
JSON.stringify({ decision: "reject", message }),
{ status: 200, headers: { "Content-Type": "application/json" } }
);
}
} catch (err) {
// In caso di errore lascia passare: non rifiutare per un guasto dell'API di Mailbeam
console.error("Errore di Mailbeam:", err);
}
return new Response(
JSON.stringify({ decision: "continue" }),
{ status: 200, headers: { "Content-Type": "application/json" } }
);
});Definisci la variabile d'ambiente
supabase secrets set MAILBEAM_KEY=mb_live_xxxxxxxxxxxxxxxxxxxxPubblica e collegala all'Auth Hook
supabase functions deploy verify-emailNel pannello di Supabase → Authentication → Hooks:
- Attiva Before User Creation
- Seleziona la tua Edge Function
verify-email
Provala in locale
supabase start
supabase functions serve verify-email --env-file .env.local
# Prova con 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":"Usa un indirizzo email permanente."}Buone pratiche
- Restituisci sempre
{ decision: "continue" }nel blocco catch: in caso di errore lascia passare - Metti
AbortSignal.timeout(5000)perché la funzione non resti appesa - Registra gli errori nei log delle funzioni di Supabase per poterli sorvegliare