Aller au contenu principal

📐 Backend — Edge Functions & Supabase


Vue d'ensemble

Le backend repose entièrement sur Supabase :

ServiceRôle
Edge Functions (Deno)Logique métier serverless
PostgreSQL + RLSPersistance des données, isolation par user
AuthJWT, sessions, OAuth
RealtimeAbonnements 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 = false est une dette technique MVP. Migration vers true pré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 :

StepProgressDescription
basic_parsing10%From, Subject, Date, Message-ID, IPs
ip_parsing20%IPv4 publiques filtrées, IPv6
received_chain30%Chaîne SMTP, TLS, cipher
domain_arc40%Domaine expéditeur, ARC headers
ip_reputation55%IPQS + AbuseIPDB + VirusTotal (parallèle)
spf73%Résultat SPF
dkim85%Résultat DKIM
dmarc/complete100%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 → utiliser fetch brut.


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

SecretDescriptionObligatoire
IPQUALITYSCORE_API_KEYFallback si aucune clé utilisateurNon
ABUSEIPDB_API_KEYFallback si aucune clé utilisateurNon
VIRUSTOTAL_API_KEYFallback si aucune clé utilisateurNon
MAKE_WEBHOOK_URLURL Make.com par défautNon
MAKE_AUTH_TOKENToken auth Make.comNon

Authentification Supabase

Flux

  1. L'utilisateur s'authentifie via Auth.tsx (email/password ou Google OAuth)
  2. Supabase génère un JWT stocké dans localStorage (via persistSession: true)
  3. Le client Supabase auto-refresh le token (autoRefreshToken: true)
  4. Le hook useAuth() expose user, 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