[Front] Page de connexion #25
Labels
No labels
Compat/Breaking
EC01
EC02
EC03
EC04
EC05
EC06
Kind/BDD
Kind/Back
Kind/Bug
Kind/CICD
Kind/Cloud
Kind/Contenu
Kind/Data
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Front
Kind/IA
Kind/Infra
Kind/Monitoring
Kind/Security
Kind/Testing
Portée/Post-jury
Priority
Critical
Priority
High
Priority
Low
Priority
Medium
Reviewed
Confirmed
Reviewed
Duplicate
Reviewed
Invalid
Reviewed
Won't Fix
Status
Abandoned
Status
Blocked
Status
Need More Info
ops/alerte
No project
2 participants
Notifications
Due date
Dependencies
No dependencies set
Reference
g2/enervision#25
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Exigence couverte
00
Épreuve servie
EC01 — Architecture
Charge estimée
No response
Ce qu'on veut obtenir
Faire une page de connexion avec mail et mot de passe
Fonctionnalité :
Critères d'acceptation
Comment on le vérifie
Tests Unitaires
Capture d'écran
Hors périmètre
No response
Maquettes de la page de connexion
Les quatre écrans sont validés côté charte graphique et disponibles dans Figma : EnerVision — Maquettes web, page « Connexion (#25) ».
Au repos
Identifiants refusés
Mobile, 390 px
Variante — identification déléguée
La charte appliquée
#0A210F— vert très sombre#000000, libellé blanc#016FB9#C2141A#14591Dsous la cible ·#E8710Aà surveiller ·#C2141AdépassementTout est branché sur des variables Figma (33 au total) : changer une valeur change les quatre écrans d'un coup. Le noir du bouton a son propre jeton
couleur/bouton-primaire, distinct du bleu des liens.Sur les critères d'acceptation
Respecter la RGAA — les contrastes sont mesurés, pas estimés. Libellé blanc sur bouton noir 21:1, texte blanc sur panneau 16,97:1, lien bleu sur blanc 5,28:1, message d'erreur 6,16:1, bordure de champ
#7E8C993,44:1 (la valeur claire d'origine échouait à 1,37:1). L'erreur est signalée par icône et texte, jamais par la couleur seule. Anneau de focus spécifié à 2 px, cibles tactiles à 48 px (52 px sur mobile).Reste à la charge de l'implémentation : association
label/for,aria-describedbyvers le message d'erreur,role="alert"sur le bandeau, ordre de tabulation,lang="fr", et le libellé accessible du bouton « Voir ».Respecter le responsive — l'écran mobile 390 est maquetté. Point de rupture à 840 px : en dessous, le panneau d'identité passe en bandeau horizontal.
Deux points ouverts
Un arbitrage est nécessaire avant d'implémenter. Ce ticket demande un formulaire courriel + mot de passe hébergé par l'application. Le contrat d'API gelé (ADR-006) prévoit l'inverse : l'application délègue l'identification au domaine d'identité du parc et ne détient qu'un cookie de session. Les deux options sont maquettées — la quatrième image est la variante conforme au contrat. Le formulaire demande de modifier le contrat ou de faire transiter le mot de passe par l'API ; la délégation est conforme à ENF-01 mais oblige à réécrire ce ticket et fait partir le lien « mot de passe oublié » chez le fournisseur d'identité.
Il manque l'état de chargement du bouton pendant la vérification. Il ne change ni la mise en page ni les jetons. L'état « vide » est sans objet ici : le défaut est l'état vide.
Maquettes issues du ticket #53. Ce commentaire est la référence de conception, pas la preuve de fermeture : le ticket se ferme quand l'écran est implémenté et testé.
Intégration de la page de connexion — livrée en relecture
Demande de fusion : #75,
olivier/25-page-connexion→develop.Trois des quatre cadres du fichier Figma sont intégrés : « Connexion — au
repos », « Connexion — identifiants refusés » et « Connexion — mobile 390 ».
Le quatrième, « Variante — identification déléguée », ne l'est pas : voir le
point ouvert en fin de commentaire.
Comment l'essayer
Aucune API à lancer : six comptes de démonstration la remplacent en
développement. Ils vivent dans
src/api/comptes-de-demonstration.json, en JSONsimple, sans aucune dépendance ajoutée. Ajouter ou retirer quelqu'un ne demande
de toucher à aucun code.
Mot de passe commun aux six :
mdp-44lenaic.g2@enervision.frolivier.g2@enervision.frmarvin.g2@enervision.frjustine.g2@enervision.frgabriel.g2@enervision.frflorian.g2@enervision.frLes rôles sont ceux de l'énumération du contrat gelé (
schemas/commun.py) :lecteur,gestionnaire,administrateur. Leur répartition est arbitraire,elle sert à ce que les trois chemins d'autorisation soient démontrables sans
changer de compte de place.
Pour atteindre le cadre « identifiants refusés » : une adresse de la liste
avec n'importe quel autre mot de passe. Le décompte descend à chaque essai
(« Il reste 3 tentatives… »), et au quatrième le compte répond 429 et affiche
le blocage temporaire. Une connexion réussie remet le compteur à zéro.
Ce mot de passe n'ouvre rien
Ni la forge, ni le serveur, ni un environnement déployé : c'est une donnée de
jeu, au même titre que les sept sites qu'elle autorise. Elle n'entre jamais
dans une construction de production.
Ce point mérite d'être dit parce que je me suis fait avoir : la première
version gardait le jeu derrière un
if (MOCK_ACTIF)et laissait pourtant lemot de passe et les six adresses dans le paquet livré. Une garde
ifne suffitpas, il faut que le module ne soit pas importé statiquement. C'est maintenant
un import dynamique sous
import.meta.env.DEV, ettests/unit/paquet-de-production.test.jsconstruit pour de vrai à chaqueexécution et échoue si quoi que ce soit fuit.
Preuve
Vérifié dans Chrome cadre par cadre : « au repos » et « identifiants refusés »
en 1440×900, « mobile 390 » en 390×844. Le refus affiche le bandeau, le
décompte, la bordure rouge, le message rattaché au champ, et le focus revient
au mot de passe.
Critères d'acceptation
foretid(le texte desubstitution vient en plus, jamais à la place), erreurs rattachées par
aria-describedby, échec annoncé une seule fois dans une zonerole="alert", focus rendu au champ à corriger, bascule de révélationavec
aria-pressed, titre de page mis à jour à chaque navigation, ciblestactiles à 44 px, anneau de focus jamais supprimé.
Contrastes : tous conformes AA, relevé complet dans
services/dashboard/README.md. Attention, le tableau joint à la planche« Socle visuel » a été calculé sur les valeurs de la planche et non sur
les variables réellement appliquées — je l'ai recalculé sur les
variables.
maquette. Colonne d'identité dans la proportion 620 / 820 du cadre 1440,
bandeau en tête en dessous.
comptes, et le contrôle du paquet de production.
contre l'API. Voir ci-dessous.
Le point qui reste ouvert
La maquette dessine un formulaire adresse + mot de passe. Le contrat d'API gelé
dit l'inverse : ADR-006 pose Keycloak et un mandataire OIDC confidentiel, et
aucune des 21 routes de
openapi.jsonn'accepte de mot de passe — « aucun motde passe ne transite par EnerVision ». Le cadre Figma « Variante —
identification déléguée » est celui qui correspond au contrat.
Les deux chemins sont écrits dans
src/api/authentification.js, c'est le seulfichier à changer une fois la décision prise. À mon sens c'est la maquette qui
doit céder, pas ADR-006 : le cadre existe déjà, il suffit de le promouvoir.
Je laisse donc ce ticket ouvert : le dernier critère n'est pas tenable tant
que le groupe n'a pas arbitré.
Deux autres écarts relevés au passage, à trancher au #53 :
dont un accent annoncé cuivre (
#A8501B) et appliqué bleu (#016FB9).Le contrat en compte trois, et « exploitant » n'en fait pas partie.