Aller au contenu

Inscription des mairies

Fonctionnalité

Flux d'auto-inscription permettant à une nouvelle mairie de créer son compte administrateur sans intervention manuelle d'UrbaFix.


Vue d'ensemble

Le processus d'inscription est en 3 étapes :

Flux d'auto-inscription d'une mairie en 3 étapes : vérification du compte, envoi et validation du token par email, puis création du compte administrateur


Pages frontend

/register.html — Demande de compte

Formulaire public en 2 étapes (même thème visuel que la page login) :

Étape 1 — Identification de la commune

Champ Validation
Nom de la commune Correspondance avec la BDD (tolérance partielle)
Code postal Format numérique, 4–10 chiffres

Étape 2 — Confirmation

Affiche l'email officiel partiellement masqué (ex. m*****@ville-menton.fr) avec deux variantes selon le contexte :

Situation Comportement
Aucun compte existant Affiche explication + bouton "Envoyer l'e-mail de validation"
Compte déjà existant Bannière orange d'avertissement + bouton "Se connecter"

/register-confirm.html — Activation du compte

Page accessible via le lien de l'email (token en paramètre URL). Fonctionne en 3 états :

État Déclencheur
Chargement Vérification automatique du token au chargement
Erreur Token invalide / expiré / déjà utilisé
Formulaire Token valide → saisie nom, prénom, email pro, mot de passe
Succès Compte créé → redirection vers login

Règles mot de passe :

  • Minimum 8 caractères
  • Au moins une majuscule
  • Au moins un chiffre
  • Indicateur de force visuel (4 niveaux)

API Endpoints

POST /api/check_mairie_registration.php

Vérifie l'existence d'une commune et l'état de son compte. Public, sans authentification.

Requête :

{ "nom_ville": "Menton", "code_postal": "06500" }

Réponse (succès) :

{
  "success": true,
  "nom_commune": "Menton",
  "email_masque": "m*****@ville-menton.fr",
  "compte_existant": false
}

Codes d'erreur :

Code Description
NOT_FOUND Aucune commune pour ce code postal
NAME_MISMATCH Nom ne correspond pas au code postal
NO_EMAIL Commune sans email configuré

POST /api/send_registration_email.php

Génère un token de validation (durée 24h), l'enregistre en base et envoie l'email. Public, sans authentification.

Requête :

{ "nom_ville": "Menton", "code_postal": "06500" }

Comportement :

  • Invalide les tokens précédents non utilisés pour la même mairie
  • Envoie l'email principal à la mairie (ou l'adresse de test en mode test)
  • Envoie une copie BCC à l'adresse de contact UrbaFix

Email envoyé :

  • Sujet : [TEST] Validation de votre compte UrbaFix – {Commune} (en mode test)
  • Lien : https://urbafix.fr/register-confirm.html?token={token64hex}
  • Template HTML : src/templates/registration_validation_html.php

GET /api/verify_registration_token.php?token=

Vérifie la validité d'un token avant d'afficher le formulaire. Public, sans authentification.

Réponse (succès) :

{
  "success": true,
  "nom_commune": "Menton",
  "code_postal": "06500",
  "expires_at": "2026-07-01 19:25:27"
}

Codes d'erreur :

Code Description
INVALID Token malformé (doit être 64 hex)
NOT_FOUND Token inexistant
ALREADY_USED Token déjà consommé
EXPIRED Token expiré (> 24h)

POST /api/confirm_registration.php

Valide le token et crée le compte administrateur. Public, sans authentification.

Requête :

{
  "token": "7995d740...",
  "nom": "Martin",
  "prenom": "Sophie",
  "email": "sophie.martin@mairie.test",
  "password": "MotDePasse1"
}

Validations :

  • Token : non expiré, non consommé
  • Nom / Prénom : ≥ 2 caractères
  • Email : format valide + non déjà utilisé
  • Mot de passe : ≥ 8 car., ≥ 1 majuscule, ≥ 1 chiffre

En cas de succès :

  • Crée l'utilisateur (role = admin, voir_tous_incidents = 1, actif = 1)
  • Marque le token used_at = NOW()
  • Transaction atomique (rollback si échec)

Base de données

Table registration_tokens

CREATE TABLE registration_tokens (
  id         INT(11)      NOT NULL AUTO_INCREMENT,
  token      VARCHAR(64)  NOT NULL,
  mairie_id  INT(11)      NOT NULL,
  expires_at DATETIME     NOT NULL,
  used_at    DATETIME     DEFAULT NULL,
  created_at TIMESTAMP    NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (id),
  UNIQUE KEY token (token),
  KEY expires_at (expires_at),
  CONSTRAINT fk_reg_tokens_mairie
    FOREIGN KEY (mairie_id) REFERENCES mairies(id) ON DELETE CASCADE
);
Colonne Rôle
token 64 caractères hex (bin2hex(random_bytes(32)))
expires_at Heure de création + 24h
used_at NULL tant que non consommé ; rempli par confirm_registration.php

Règle : à chaque nouvelle demande pour une même mairie, les tokens non utilisés existants sont supprimés avant d'en générer un nouveau.


Sécurité

Mesure Détail
Entropie token 256 bits (random_bytes(32)) — résistant à la force brute
Unicité Index UNIQUE sur token
Expiration 24h — limité la fenêtre d'attaque
Usage unique used_at empêche la réutilisation
Un token à la fois Les anciens tokens non utilisés sont révoqués à chaque nouvelle demande
Pas d'énumération Les erreurs NOT_FOUND et EXPIRED ont des messages distincts mais sans révéler l'email réel
Mot de passe hashé password_hash($password, PASSWORD_BCRYPT)
Email unique Vérification UNIQUE KEY sur users.email
Transaction Création compte + consommation token en une transaction atomique

Mode test / production

Contrôlé par app_settings.email_test_mode :

Valeur Comportement
1 (test) Emails redirigés vers l'adresse de test, sujet préfixé [TEST]
0 (prod) Emails envoyés à l'email officiel de la mairie

La copie BCC vers l'adresse de contact UrbaFix est envoyée dans tous les modes.


Fichiers

Fichier Rôle
public/register.html Page de demande (étapes 1 et 2)
public/register-confirm.html Page d'activation (saisie des infos + création compte)
public/api/check_mairie_registration.php Vérification commune + état compte
public/api/send_registration_email.php Génération token + envoi email
public/api/verify_registration_token.php Vérification token
public/api/confirm_registration.php Création du compte
src/templates/registration_validation_html.php Template HTML de l'email de validation