📐 Backend — Edge Functions & Supabase
Vue d'ensemble
Le backend repose entièrement sur Supabase :
| Service | Rôle |
|---|---|
| Edge Functions (Deno) | Logique métier serverless |
| PostgreSQL + RLS | Persistance des données, isolation par user |
| Auth | JWT, sessions, OAuth |
| Realtime | Abonnements WebSocket aux changements DB |
Edge Functions
Configuration globale
# supabase/config.toml
project_id = "lknpnomhfqcgkktxydui"
[functions.analyze-email-headers]
verify_jwt = false
[functions.analyze-spam]
verify_jwt = false
[functions.arcep-check]
verify_jwt = false
[functions.trigger-n8n-export]
verify_jwt = false
[functions.trigger-make-scenario]
verify_jwt = false
⚠️
verify_jwt = falseest une dette technique MVP. Migration verstrueprévue Q2 2026.
CORS : Toutes les fonctions acceptent * et répondent aux preflight OPTIONS.
Base URL : https://<PROJECT_ID>.supabase.co/functions/v1/
analyze-email-headers
Type : SSE streaming (Server-Sent Events)
Content-Type : text/event-stream
Analyse complète des en-têtes email en 8 étapes séquentielles avec streaming temps réel. Appelle optionnellement IPQualityScore, AbuseIPDB et VirusTotal en parallèle (step ip_reputation).
Séquence des steps :
| Step | Progress | Description |
|---|---|---|
basic_parsing | 10% | From, Subject, Date, Message-ID, IPs |
ip_parsing | 20% | IPv4 publiques filtrées, IPv6 |
received_chain | 30% | Chaîne SMTP, TLS, cipher |
domain_arc | 40% | Domaine expéditeur, ARC headers |
ip_reputation | 55% | IPQS + AbuseIPDB + VirusTotal (parallèle) |
spf | 73% | Résultat SPF |
dkim | 85% | Résultat DKIM |
dmarc/complete | 100% | Résumé final |
Format d'un event SSE :
data: {"step":"spf","status":"success","data":{"status":"pass","message":"SPF: PASS"},"progress":73}
Suivi de data: [DONE] pour signaler la fin du stream.
⚠️
supabase.functions.invoke()ne supporte pas le streaming SSE → utiliserfetchbrut.
analyze-spam
Type : JSON synchrone
Analyse le contenu d'un email contre 13 patterns inline et 5 règles de headers. Retourne un score hybride pondéré.
Patterns inline : sous-ensemble de spam_patterns.json (les Edge Functions Deno n'ont pas accès au filesystem du projet).
Formule :
patternScore = max(finalScore de chaque pattern déclenché)
headerScore = sum(modifier de chaque règle header déclenchée), plafonné à 100
scoreFinal = min(100, round(patternScore × 0.6 + headerScore × 0.4))
arcep-check
Type : JSON synchrone
Actions : check | info | refresh
Vérifie un numéro téléphonique contre la base ARCEP. Maintient un cache in-memory Deno avec TTL de 1h.
Source : https://codeberg.org/cbouvat/saracroche-android/raw/branch/main/app/src/main/assets/french-list-arcep-operators.json
Algorithme de normalisation :
// 0612345678 → 33612345678
// +33612345678 → 33612345678
// 0033612345678 → 33612345678
Pattern matching : chaque préfixe ARCEP contient des # (wildcard chiffre) → converti en regex \d.
⚠️ Le cache in-memory est best-effort en production Supabase (instances Deno recyclées).
trigger-n8n-export
Type : JSON synchrone
Transmet les données d'analyse à un webhook n8n avec les données formatées en JSON, XML, CSV et ICS.
Payload envoyé :
{
"timestamp": "ISO",
"analysis": { "spf": "fail", "threatLevel": "high", ... },
"exports": { "sheets": true, "xml": true, "json": true },
"formats": { "json": "...", "xml": "...", "csv": "...", "calendar": "..." }
}
trigger-make-scenario
Type : JSON synchrone
Déclenche un scénario Make.com. Accepte une URL personnalisée ou utilise le secret MAKE_WEBHOOK_URL.
Ajoute le header X-Auth-Token si MAKE_AUTH_TOKEN est configuré en secret Supabase.
Secrets Supabase Edge Functions
| Secret | Description | Obligatoire |
|---|---|---|
IPQUALITYSCORE_API_KEY | Fallback si aucune clé utilisateur | Non |
ABUSEIPDB_API_KEY | Fallback si aucune clé utilisateur | Non |
VIRUSTOTAL_API_KEY | Fallback si aucune clé utilisateur | Non |
MAKE_WEBHOOK_URL | URL Make.com par défaut | Non |
MAKE_AUTH_TOKEN | Token auth Make.com | Non |
Authentification Supabase
Flux
- L'utilisateur s'authentifie via
Auth.tsx(email/password ou Google OAuth) - Supabase génère un JWT stocké dans
localStorage(viapersistSession: true) - Le client Supabase auto-refresh le token (
autoRefreshToken: true) - Le hook
useAuth()exposeuser,session,signIn,signUp,signOut
AuthProvider
// src/integrations/supabase/auth.tsx
const AuthContext = createContext<AuthContextType>({...});
export const AuthProvider = ({ children }) => {
const [user, setUser] = useState<User | null>(null);
const [session, setSession] = useState<Session | null>(null);
useEffect(() => {
supabase.auth.getSession().then(({ data: { session } }) => {
setSession(session);
setUser(session?.user ?? null);
});
const { data: { subscription } } = supabase.auth.onAuthStateChange(
(_event, session) => {
setSession(session);
setUser(session?.user ?? null);
}
);
return () => subscription.unsubscribe();
}, []);
return <AuthContext.Provider value={{ user, session, signIn, signUp, signOut, signInWithGoogle }}>
{children}
</AuthContext.Provider>;
};
Realtime Supabase
Seule la table community_reports est abonnée en temps réel :
// useCommunityReports.ts
const channel = supabase
.channel('community_reports_changes')
.on('postgres_changes', {
event: '*',
schema: 'public',
table: 'community_reports'
}, () => fetchReports())
.subscribe();
Cela permet aux signalements communautaires d'être visibles en temps réel pour tous les utilisateurs connectés.
Appels depuis le frontend
// Appel standard (JSON)
const { data, error } = await supabase.functions.invoke('analyze-spam', {
body: { emailContent: '...', spf: 'fail', dkim: 'pass', dmarc: 'fail' }
});
// Appel streaming SSE (fetch brut obligatoire)
const response = await fetch(
`${import.meta.env.VITE_SUPABASE_URL}/functions/v1/analyze-email-headers`,
{
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${import.meta.env.VITE_SUPABASE_PUBLISHABLE_KEY}`,
},
body: JSON.stringify({ emailHeaders, enabledApis, apiKeys })
}
);
// Traiter response.body comme ReadableStream
Développement local
# Installer Supabase CLI
npm install -g supabase
# Lancer localement
supabase start
supabase functions serve
# Déployer les fonctions
supabase functions deploy analyze-spam
supabase functions deploy analyze-email-headers
supabase functions deploy arcep-check
supabase functions deploy trigger-n8n-export
supabase functions deploy trigger-make-scenario