CONTRAT API : RADIUS PPPoE (Abonnés)
Date : 2026-08-31 Auteur : L’équipe J+SERVICES Statut : DRAFT / IMPLEMENTED Base URL : `/v1/radius/pppoe`
Description
Le module PPPoE AAA (produit opérateur fibre/quartier) permet l’authentification et l’autorisation des abonnés PPPoE via le serveur virtuel `pppoe` de FreeRADIUS (déployé sur le VPN/RADIUS add-on). Contrairement au Hotspot (profils à durée), ce module gère des comptes permanents (un foyer = un compte).
⚠️ Note d’Architecture : L’état vit exclusivement dans RADIUS. Nous ne dupliquons pas de base d’abonnés en local dans PostgreSQL pour éviter toute divergence.
1. Lister les abonnés PPPoE
Liste tous les abonnés du tenant courant, enrichis avec leur consommation agrégée sur les 30 derniers jours (données issues de `radacct`).
Requête : `GET /v1/radius/pppoe/subscribers`
Query Params (Optionnels) :
- `depuis` (String, ISO-8601) : Date de début d’agrégation de la consommation. (Défaut : il y a 30 jours).
Réponse (200 OK) : ```json { “abonnes”: [ { “username”: “pppoe_hash_jean”, “nom”: “jean”, “go_30j”: 124.5 } ], “source”: “RADIUS” } ```
2. Créer ou Mettre à jour un abonné PPPoE
Opération idempotente (upsert). Crée un abonné dans `radcheck` et applique ses attributs de débit ou d’IP statique dans `radreply`.
Requête : `POST /v1/radius/pppoe/subscribers`
Body : ```json { “nom”: “jean”, “mot_de_passe”: “secret123”, “debitMbps”: 10, “ipStatique”: “100.64.10.15” } ``` (Note: `password` est accepté comme alias de `mot_de_passe`.)
Règles de validation :
- `nom` : alphanumérique, points, tirets, underscores. 1-32 caractères.
- `mot_de_passe` : au moins 4 caractères.
- `ipStatique` : L’IP statique (Framed-IP-Address) n’est posée que si elle est valide, car une IP erronée fait planter l’établissement PPP côté NAS.
Réponse (201 Created) : ```json { “username”: “pppoe_hash_jean”, “nom”: “jean”, “debit_mbps”: 10, “ip_statique”: “100.64.10.15” } ```
3. Supprimer un abonné PPPoE
L’abonné ne pourra plus se connecter lors de la prochaine négociation PPP.
Requête : `DELETE /v1/radius/pppoe/subscribers/:nom`
Paramètres d’URL :
- `nom` : Le nom de l’abonné (ex: `jean`).
Réponse (200 OK) : ```json { “username”: “pppoe_hash_jean”, “supprime”: true } ```