Skip to content

Envoyer le lien de connexion par l'API via Brevo #397

Open

Description

@PaulThiberville

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-link avec { email, language } (fr ou en, 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_error pour une adresse invalide ; 429 rate_limited moins 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-staging depuis « 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.com en 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, fr en français : textes en Localized<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 fr et en, avec le mode sombre (D-070) : prefers-color-scheme et méta color-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

  1. added this to the v0.4 milestone on Oct 13, 2026
  2. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    CollaboratorAuthor

    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.

  3. added
    status:blockedBloqué, voir commentaire ⛔
    and removed
    needs-designQuestion ou maquette à produire en mode DESIGN
    on Oct 14, 2026
  4. IlanAMG commented on Oct 14, 2026

    @IlanAMG
    Member

    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-design retiré ; 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 de widooapp.com (#366, Ilan).

  5. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    CollaboratorAuthor

    État du compte Brevo, relevé par l'orchestrateur par connecteur le 2026-10-15 (Inbox) :

    • compte d'Ilan, plan gratuit, 300 e-mails par jour (le plafond que D-090 demandait de vérifier sur le compte) ;
    • un seul expéditeur vérifié : contact@inprogress.agency ; aucun expéditeur ni domaine widoo.app ;
    • relais SMTP désactivé.

    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) :

    1. Authentifier le domaine d'envoi dans Brevo (SPF, DKIM, DMARC). Le domaine retenu est widooapp.com (D-077 : widoo.app n'appartient pas à Inprogress), pas encore acheté.
    2. Créer et faire vérifier l'expéditeur « Widoo » sur une adresse de ce domaine, et l'adresse de réponse.
    3. Créer une clé d'API Brevo pour l'API de staging et l'enregistrer dans Secret Manager de 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.

  6. PaulThiberville commented on Oct 16, 2026

    @PaulThiberville
    CollaboratorAuthor

    Brevo, staging : la clé d'API est dans Secret Manager de widoo-staging sous le nom brevo-api-key (#467). À monter en variable BREVO_API_KEY par infra/gcp/3-run.sh via optional_secret, à prévoir dans le ticket de code. L'expéditeur n'est pas encore créé : il attend l'authentification de widooapp.com (#467, après #366).

  7. added
    status:readySpec complète, prêt à coder
    and removed
    status:blockedBloqué, voir commentaire ⛔
    on Oct 20, 2026
  8. PaulThiberville commented on Oct 20, 2026

    @PaulThiberville
    CollaboratorAuthor

    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é.

  9. PaulThiberville commented on Oct 21, 2026

    @PaulThiberville
    CollaboratorAuthor

    MANAGER, 2026-10-21 : staging garde l'expéditeur contact@inprogress.agency (D-105) ; l'expéditeur Brevo Widoo <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).

  10. PaulThiberville commented on Oct 21, 2026

    @PaulThiberville
    CollaboratorAuthor

    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.agency n'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 reste status:ready.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions