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