Repository navigation
Envoyer le lien de connexion par l'API via Brevo #397
Description
Contexte
Epic : #6
Architecture-Technique (ligne E-mails : Brevo) · API › Compte (POST /auth/email-link) · Securite-et-RGPD (limitation de débit) · Ecrans › E-22 · Compte-et-Monetisation › Authentification · E-10, E-22 · D-069, D-090, D-105, D-111
Maquette : E-22 · validée le 2026-09-28
D-069 prévoit que le lien de connexion soit généré par l'Admin SDK et envoyé par l'API via Brevo, sur le modèle Widoo de E-22, à la place du modèle Firebase. #384 et #386 font partir l'e-mail par Firebase directement, en attendant. Au test du 2026-10-13 contre widoo-staging, le mail Firebase (adresse par défaut, modèle anglais) est arrivé dans le courrier indésirable (Inbox).
Décidé par Ilan le 2026-10-14 (D-090) : Brevo en v0.4, avec la langue des e-mails (#199) ; d'ici là, l'app garde l'envoi par Firebase, pour les tests de l'équipe. Compte Brevo transmis à Paul le 2026-10-14.
D-105 (décision de l'opérateur du 2026-10-20, à confirmer par Ilan, Design-Changelog › D-105, Architecture-Technique › E-mails par environnement) : ce ticket ne dépend plus de #467. Staging envoie depuis l'expéditeur Brevo déjà vérifié contact@inprogress.agency (nom d'affichage « Widoo ») (→ révisé par D-111, ci-dessous), avec la clé de staging déjà en Secret Manager ; production n'envoie rien avant l'achat et l'authentification de widooapp.com (#366, #467). L'adresse est une seule valeur de configuration de l'API (variable d'environnement), jamais en dur.
D-111 (décision de Paul du 2026-10-21, D-111, révise D-105) : staging et production envoient depuis « Widoo contact@widooapp.com », l'expéditeur vérifié dans Brevo sur le domaine authentifié (D-110) ; contact@inprogress.agency n'est plus utilisé. La variable d'environnement de l'expéditeur, nommée par CODE dans ce ticket, vaut contact@widooapp.com dans tous les environnements déployés ; aucun envoi en local.
Comportement attendu
- L'app demande le lien à l'API,
POST /v1/auth/email-linkavec{ email, language }(frouen, la langue effective de l'app, Migration : users.locale, users.notification_prefs, PATCH /me et POST /me/devices avec la langue #197). L'API le génère par l'Admin SDK (generateSignInWithEmailLink), avec l'adresse de retour et les réglages du lien fixés côté API, jamais par l'app, et l'envoie par Brevo sur le modèle « Connexion » de E-22, dans la langue demandée. - Réponse 202 sans corps, identique que l'adresse ait un compte ou non ; 422
validation_errorpour une adresse invalide ; 429rate_limitedmoins de 30 s après l'envoi précédent à la même adresse, au-delà de 5 envois par heure pour l'adresse ou de 30 par heure pour l'IP. - « Renvoyer dans 30 s » et « Recevoir un nouveau lien » (E-10) passent aussi par l'API.
- Expéditeur et adresse de réponse (
Reply-To) : « Widoo contact@widooapp.com » dans tous les environnements déployés (staging comme production, D-111), lus dans une seule valeur de configuration de l'API (variable d'environnement nommée par CODE, partagée avec Envoyer par Brevo les messages « Nous écrire » à l'adresse configurée #450), jamais en dur ; en local, sans clé Brevo, aucun envoi. - Ni l'adresse ni le lien dans les journaux, Sentry ou PostHog ; la clé Brevo vit dans Secret Manager, jamais dans Git.
- Hors périmètre : l'admin web (A-01), réservé à l'équipe, garde le lien envoyé par Firebase.
Critères d'acceptation
- Décision d'Ilan écrite dans Architecture-Technique ou Compte-et-Monetisation (Brevo dès la v0.4, ou Firebase pour le MVP), endpoint et limites dans API si Brevo (D-090)
- (CODE) e-mail de connexion reçu sur
widoo-stagingdepuis « Widoo contact@widooapp.com », avec la même adresse en réponse (D-111), gabarit E-22, en français et en anglais ; boîte de réception ou indésirables noté dans la PR - (CODE) adresse de l'expéditeur et de réponse lue dans la configuration de l'API (variable d'environnement nommée dans la PR, valeur
contact@widooapp.comen staging et en production), jamais en dur ; sans clé Brevo (local), rien ne part (test) - (CODE) test : la réponse est identique pour une adresse connue et inconnue ; au-delà de la limite,
429 - (reporté de Envoyer push, e-mails et pages légales dans la langue de l'utilisateur #199, PR feat(api): choisir langue et préférences de chaque envoi #493) Une demande faite avec
language: "en"envoie l'e-mail de connexion en anglais,fren français : textes enLocalized<T>(test) - (CODE) l'app (Connecter l'utilisateur avec Google et par lien e-mail (E-10) #386) demande le lien à l'API et non plus à Firebase, renvoi compris
- (CODE) ni adresse ni lien dans les journaux : test ou relecture mentionnés dans la PR
Notes techniques
- Modèles E-22 en
freten, avec le mode sombre (D-070) :prefers-color-schemeet métacolor-scheme. - Mêmes réglages de lien que l'app aujourd'hui (domaine
<projet>.firebaseapp.com/__/auth/links, ouverture dans l'app), pour que l'interception du lien par l'app ne change pas. - Route publique d'authentification : revue OWASP (A07) et niveau de risque à annoncer dans la PR.
Activity
PaulThiberville commentedon Oct 14, 2026
Même prestataire et même décision de sous-traitant que #450 (envoi des messages « Nous écrire » à contact@widoo.app par Brevo, P1, v0.3). Le client Brevo et son secret peuvent être posés une seule fois, par le premier des deux tickets qui passe en code.
IlanAMG commentedon Oct 14, 2026
Chef de projet (2026-10-14) : décision d'Ilan, D-090, sur ta proposition : Brevo en v0.4 avec #199 ; d'ici là, l'app garde l'e-mail de Firebase. Ilan t'a transmis le compte Brevo.
Ticket réécrit : route
POST /v1/auth/email-link, 202 identique pour toute adresse, limites (30 s et 5/heure par adresse, 30/heure par IP), lien et adresse de retour fixés par l'API, rien dans les journaux. Ce sont des choix par défaut écrits dans API › Compte et Securite-et-RGPD : à revoir dans la PR si besoin.needs-designretiré ; le ticket est bloqué par #467, la tâche humaine du domaine dans Brevo (SPF, DKIM, DMARC, expéditeur, clé de staging), elle-même après l'achat dewidooapp.com(#366, Ilan).PaulThiberville commentedon Oct 15, 2026
État du compte Brevo, relevé par l'orchestrateur par connecteur le 2026-10-15 (Inbox) :
contact@inprogress.agency; aucun expéditeur ni domainewidoo.app;Rien ne permet donc encore d'envoyer au nom de Widoo. Actions humaines restantes, portées par #467 (tâche de Paul), elle-même après l'achat du domaine (#366, tâche d'Ilan) :
widooapp.com(D-077 :widoo.appn'appartient pas à Inprogress), pas encore acheté.widoo-staging, jamais dans Git ni dans le chat.Le relais SMTP n'est pas requis si l'API envoie par l'API HTTP de Brevo ; à confirmer au moment de #467.
PaulThiberville commentedon Oct 16, 2026
Brevo, staging : la clé d'API est dans Secret Manager de
widoo-stagingsous le nombrevo-api-key(#467). À monter en variableBREVO_API_KEYparinfra/gcp/3-run.shviaoptional_secret, à prévoir dans le ticket de code. L'expéditeur n'est pas encore créé : il attend l'authentification dewidooapp.com(#467, après #366).PaulThiberville commentedon Oct 20, 2026
MANAGER, 2026-10-20 : dépendance
blocked_by#467 retirée selon D-105 : staging envoie depuis l'expéditeur Brevo vérifiécontact@inprogress.agency(clé de staging déjà en Secret Manager), production attend le domaine (#366, #467). Plus aucun bloqueur ouvert :status:ready. Critère d'envoi réécrit pour l'expéditeur configuré.PaulThiberville commentedon Oct 21, 2026
MANAGER, 2026-10-21 : staging garde l'expéditeur
contact@inprogress.agency(D-105) ; l'expéditeur BrevoWidoo <contact@widooapp.com>est désormais vérifié (D-110 (2026-10-21), #467) et disponible si l'opérateur décide de l'utiliser aussi en staging : option ouverte, décision de Paul, sans effet sur le code (une valeur de configuration).PaulThiberville commentedon Oct 21, 2026
MANAGER, 2026-10-21 : décision de Paul D-111 (2026-10-21), qui révise D-105 : l'expéditeur et l'adresse de réponse du lien de connexion sont « Widoo contact@widooapp.com » dans tous les environnements déployés, staging compris ;
contact@inprogress.agencyn'est plus utilisé. Valeur de configuration de l'API (variable d'environnement à nommer par CODE dans ce ticket, partagée avec #450) ; aucun envoi en local. Comportement attendu et critères mis à jour ; le ticket restestatus:ready.