Skip to content

DGFiP : adresse IP publique de connexion et adresse postale du contact technique - #1762

Open
jbfeldis wants to merge 4 commits into
developfrom
feature/dpp-72-demande-externe-dgfip-ajouter-adresse-ip-publique-de
Open

jbfeldis wants to merge 4 commits into
developfrom
feature/dpp-72-demande-externe-dgfip-ajouter-adresse-ip-publique-de

Conversation

@jbfeldis

@jbfeldis jbfeldis commented Sep 16, 2026

Copy link
Copy Markdown
Contributor
dpp-72-demo.mp4

Pourquoi

La DGFiP a besoin de deux informations qu'elle ne collecte pas aujourd'hui dans DataPass :
l'adresse IP publique par laquelle le téléservice interroge ses APIs — indispensable à
l'ouverture des accès sur leur APIM — et l'adresse postale professionnelle du contact
technique
, pour leurs correspondances.

Retour DGFiP du 11/09, acté le 14/09 : les deux champs sont obligatoires, sur 5 APIs en priorité, les autres « au fil de
l'eau ». L'autocomplétion d'adresse reste hors sujet à ce stade — saisie libre, avec l'annotation qu'ils ont rédigée.

Périmètre

5 APIs, soit 12 classes (bac à sable + production) : SFiP, Impôt Particulier, RIAL,
INFINOE, FICOBA.

SFiP R2P est inclus en plus et reste à faire confirmer par la DGFiP : ils n'ont listé que
« API Courtier fonctionnel SFiP », mais SFiP R2P porte la même marque et récupère le flux des
demandes R2P dépréciées. Si la réponse est non, il suffit de retirer les deux include de
APISFiPR2P et APISFiPR2PSandbox.

Où atterrissent les champs

volumetrie_approximative est rendu dans le bloc basic_infos, pas dans le bloc volumetrie.
Or basic_infos est une étape du formulaire bac à sable et un static_block en production.
« Juste après la volumétrie approximative » (maquette DGFiP) et « sur le BAS » (Natalia) désignent
donc le même endroit.

BAC À SABLE   basic_infos → legal → modalities → scopes → personal_data → contacts
                └─ ADRESSE IP PUBLIQUE                        └─ ADRESSE + COMPLÉMENT

PRODUCTION    static_blocks : basic_infos … contacts   ← hérités, jamais redemandés
              étapes        : operational_acceptance → safety_certification → volumetrie

Ce que ça change pour le stock (annoncé à la DGFiP, vérifié en transaction annulée)

Cas Effet
Nouvelle demande Champ obligatoire classique
En cours d'instruction Rien ne casse, l'instructeur peut toujours valider ; l'habilitation est créée champ vide
Renvoyée pour modification Re-soumission refusée tant que le champ est vide
Habilitation validée Aucun impact, jamais revalidée
Mise à jour (réouverture) Soumission refusée tant que le champ est vide — c'est là que le stock se complétera
Refusée / révoquée / archivée Aucun impact

Validation de l'adresse IP

IPAddr (stdlib) accepte IPv4, IPv6 et les plages CIDR, et permet de refuser ce qui n'est pas
public : 10.x, 172.16-31.x, 192.168.x, fd00::/8, loopback, lien local, ainsi que
0.0.0.0/0 et ::/0 qui videraient le champ de son sens. Plusieurs adresses séparées par
virgule, point-virgule ou saut de ligne sont acceptées — plusieurs IP de sortie est un cas courant.

Comment tester

En local, /local-sign-in?email=user@yopmail.com puis
/formulaires/api-ficoba-sandbox/demande/nouveau :

  1. Étape « Mon projet » — le champ « Adresse IP publique de connexion » apparaît juste après la
    volumétrie approximative, avec le texte d'aide de la DGFiP.
    • vide → bloqué (le champ reçoit required, le navigateur bloque avant l'envoi) ;
    • 192.168.1.10 → refusé côté serveur, message explicite ;
    • 185.24.184.0/24 ou 192.0.2.10 → accepté ;
    • 192.0.2.10, 198.51.100.4 → accepté aussi.
  2. Étape « Les personnes impliquées » — dans la carte Contact technique (au-dessus du
    séparateur « Contact supplémentaire », pas en dessous) : « Adresse du contact technique »
    obligatoire avec l'annotation DGFiP, et « Complément adresse » facultatif.
  3. Récapitulatif — les deux valeurs s'affichent, côté demandeur comme côté instruction.
  4. Passage en production — une fois le bac à sable validé, démarrer la production : les deux
    champs ne sont pas redemandés et les valeurs sont reprises.
  5. Hors périmètre — sur une autre API DGFiP (OPALE par exemple), aucun des deux champs
    n'apparaît.

Points d'attention pour la relecture :

  • les vues touchées sont partagées par les 36 définitions DGFiP : le cloisonnement tient
    uniquement aux gardes respond_to? et au fait que seules les 12 classes déclarent les attributs ;
  • côté consultation, trois fichiers étaient nécessaires : seules api_impot_particulier et
    api_sfip surchargent le bloc contacts, FICOBA / RIAL / INFINOE retombent sur la vue par défaut ;
  • /api/v1/demandes exigera les nouveaux champs à la soumission pour ces 5 APIs : à signaler aux
    éditeurs concernés.

Captures

champ-adresse-contact champ-adresse-ip erreur-ip-privee recap-adresse-contact recap-adresse-ip

@linear

linear Bot commented Sep 16, 2026

Copy link
Copy Markdown

DPP-72

La DGFiP demande une adresse IP publique de connexion, qui doit accepter
une adresse IPv4 ou IPv6, une plage CIDR, et plusieurs valeurs séparées
par des virgules, points-virgules ou sauts de ligne — les demandeurs ont
souvent plusieurs IP de sortie.

IPAddr couvre tous ces formats et expose private?, loopback?,
link_local? et prefix, ce qui permet de refuser ce qui n'est pas une
adresse publique : 10.x, 172.16-31.x, 192.168.x, fd00::/8, loopback,
lien local, et les plages 0.0.0.0/0 et ::/0 qui videraient le champ de
son sens.

La classe s'appelle PublicIpAddressValidator plutôt que
PublicIPAddressValidator : enregistrer « IP » comme acronyme global
ferait chevaucher l'alternation des acronymes avec DGFIP.

Le validateur ne dépend d'aucun champ DGFiP et se réutilise tel quel.
La DGFiP demande une adresse IP publique de connexion et l'adresse
postale du contact technique, les deux obligatoires, sur cinq APIs en
priorité : SFiP, Impôt Particulier, RIAL, INFINOE et FICOBA. SFiP R2P
est inclus en plus — même marque « Courtier fonctionnel SFiP », et c'est
lui qui récupère le flux des demandes R2P dépréciées — à faire confirmer
par la DGFiP.

Les attributs vivent dans deux concerns dédiés plutôt que dans
ExtraContactsInfos, qui est inclus par les 36 classes DGFiP et étendrait
les champs aux treize autres APIs. Le cloisonnement du périmètre tient à
cette déclaration : les vues, partagées, se contentent d'un garde
respond_to?.

Les classes de production déclarent les attributs elles aussi. Le
passage en production mute la demande existante (start_next_stage change
type et form_uid sur le même enregistrement) : sans la déclaration, la
valeur saisie en bac à sable deviendrait invisible.

L'adresse IP se pose dans le bloc basic_infos, où est déjà rendue la
volumétrie approximative — donc sur le formulaire bac à sable,
conformément à la maquette et à la demande. L'adresse postale se pose
dans la carte du contact technique, au-dessus du séparateur « Contact
supplémentaire » : elle décrit le contact technique lui-même, pas la
personne supplémentaire que ce bloc introduit. Le complément d'adresse
reste facultatif.

Côté consultation, trois fichiers sont nécessaires : seules
api_impot_particulier et api_sfip surchargent le bloc contacts, FICOBA,
RIAL et INFINOE retombent sur la vue par défaut. Sans les deux,
l'adresse serait saisie puis invisible sur trois des cinq APIs.

Les textes d'aide reprennent mot pour mot ceux fournis par la DGFiP.

Les gardes respond_to? dans les factories rendent valides les quarante
traits DGFiP existants sans les toucher un par un. Le spec d'acceptance
des formulaires et les deux steps Cucumber partagés sont mis à jour pour
la même raison : ils traversent les formulaires éditeur, qui n'ont pas
de static_blocks et redemandent donc basic_infos et contacts.
Six scénarios sur FICOBA : le champ IP obligatoire dès l'étape du
projet, le refus d'une adresse privée, l'adresse du contact technique
obligatoire et son complément facultatif, une demande complète dont les
deux valeurs se retrouvent au récapitulatif, et l'absence des deux
champs sur une API DGFiP hors périmètre.

Le sixième déroule la chaîne réelle : remplissage du bac à sable,
soumission, validation par un instructeur, démarrage de la production,
soumission de la production, puis vérification que les valeurs saisies
au bac à sable sont toujours là. C'est ce qui prouve l'héritage par
static_blocks à travers un vrai approve, le point le plus fragile de la
conception.

Les scénarios négatifs vérifient le blocage à l'étape du tunnel plutôt
qu'à la soumission finale : c'est là que le demandeur rencontre
l'erreur, et ça évite de rejouer le tunnel entier à chaque cas.

Côté instruction, le scénario porte sur API Impôt Particulier, qui passe
par la surcharge du bloc contacts plutôt que par la vue par défaut déjà
couverte côté demandeur.
@jbfeldis
jbfeldis force-pushed the feature/dpp-72-demande-externe-dgfip-ajouter-adresse-ip-publique-de branch from ba8891e to c1a4a30 Compare September 17, 2026 21:08
@jbfeldis
jbfeldis marked this pull request as ready for review September 17, 2026 21:09

@Isalafont Isalafont left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Peut être juste rajouter des examples côté vu.

Question on attend quel format d'adresse ? X rue de MMM, code postal et ville ? en plusieurs champs ?

Par exemple :
j'ai pu remplir cela et rien n'a bloqué
Capture d’écran 2026-09-18 à 14 31 40

Comment thread config/locales/authorization_request_forms.fr.yml Outdated
adresse_ip_publique:
hint: L’ouverture de l’accès aux informations de la DGFIP est sécurisée et nécessite de communiquer l’adresse IP publique (ou la plage la plus réduite possible) par laquelle vos applications interrogent nos APIs. Toute modification de l’adresse IP publique nécessitera une mise à jour de la demande.
contact_technique_adresse:
hint: Nous insistons à cet égard sur le besoin d’une adresse postale professionnelle sans laquelle cette opération serait considérablement ralentie. Attention, merci de bien vouloir nous transmettre une adresse postale professionnelle, complète, exacte et à jour, afin de garantir le bon acheminement de nos correspondances et d’éviter toute erreur de destinataire.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On attend quoi exactement de ce champs ?
une adresse complète avec code postale et ville inclus ?
en un seul champs ou plusieurs champs ?
Je pose la question mais ce n'est pas clairement defini dans le ticket

Sinon même suggestion qu'au dessus :
rajouter un exemple d'adresse fictive différente de celle du message d'erreur.
(Point Accessibilite)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

J'ai rajouté un exemple aussi.
On attend... une adresse postale correcte en résumé. Ils voulaient un autocomplete, on n'a pas la bande passante donc on fait au plus simple 🤷

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Avec les exemples ça me va 👍🏻

Je me demande quand même si on veut un seul champs pour l'adresse complète ou plusieurs disctinct ? (par exemple : un champ adresse, un code postal, un autre ville)
Est ce que ce ne serait pas un moyen de préparer l'autocomplète par exemple ?

Les deux textes d'aide reprennent mot pour mot ceux fournis par la
DGFiP, et aucun ne dit à quoi ressemble une valeur attendue. Un
demandeur qui ne connaît pas les adresses IP n'avait, pour tout exemple,
que le message d'erreur — donc après coup.

Pour l'adresse IP, les exemples utilisent les plages réservées à la
documentation par la RFC 5737, et volontairement d'autres que celles du
message d'erreur. Les formats acceptés et le refus des adresses privées
étaient implicites dans le validateur, ils sont désormais à l'écran.

Pour l'adresse postale, la mention d'une seule ligne avec code postal et
commune est une décision de notre côté : le ticket ne tranche pas entre
un champ unique et plusieurs. À revoir si la DGFiP répond autrement.
Le complément d'adresse n'avait aucun texte d'aide.

Les textes de la DGFiP ne sont pas réécrits, les précisions viennent à
leur suite.
@jbfeldis
jbfeldis requested a review from Isalafont September 20, 2026 20:29

@Isalafont Isalafont left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Techniquement, il n'y a rien qui bloque.
J'ai juste une question sur le fait d'avoir un champs unique vs 3 par exemple mais en l'état si 1 seul champ est ok pour eux alors go

This branch was successfully deployed

1 active deployment
sandbox ab960ecb Deployed Sep 22, 2026 by jbfeldis via deployment (watchdoge4) #224
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants