Aller au contenu

Console

La console (/api/v1/console/*) est la surface libre-service derrière le portail bloonio_chat_admin_ssr (port 4318). Un admin s’inscrit (par OTP e-mail), possède un espace de travail (workspace), et y gère ses tenants, opérateurs, membres et invitations — sans jamais toucher à la clé admin de plateforme.

L’authentification est un jeton de console (console_token, HS256, ~7 jours, kind=tenant_admin), scopé à travers les appartenances aux espaces de travail.

L’inscription est en deux étapes et atterrit toujours dans un espace de travail — créé depuis organization_name, ou rejoint via un invite_token.

  1. DémarrerPOST /console/register crée un compte PENDING et envoie un OTP par e-mail. En dev local (ENV=local, SMTP non configuré), la réponse renvoie l’OTP dans dev_otp.
  2. VérifierPOST /console/verify/registration valide l’OTP, active le compte, crée (ou rejoint) l’espace de travail et renvoie une session.
  3. Renvoyer (au besoin) — POST /console/resend/registration-otp.
Fenêtre de terminal
curl $BASE_URL/api/v1/console/register \
-X POST -H "Content-Type: application/json" \
-d '{
"email": "admin@acme.com",
"password": "une-phrase-de-passe-forte",
"display_name": "Alex Admin",
"organization_name": "Acme Co"
}'

POST /console/login authentifie par e-mail + mot de passe. Le résultat est discriminé par redirect_to_mfa :

  • false — pas de second facteur : la session complète (avec console_token) est renvoyée.
  • true — un challenge_token et la liste mfa_factors (par exemple ["email", "totp"]) sont renvoyés ; il faut compléter un second facteur.
Fenêtre de terminal
# 1. Login → renvoie un challenge_token quand redirect_to_mfa = true
curl $BASE_URL/api/v1/console/login -X POST -H "Content-Type: application/json" \
-d '{"email":"admin@acme.com","password":"..."}'
# 2. Émettre l'OTP du second facteur
curl $BASE_URL/api/v1/console/get/login-otp -X POST -H "Content-Type: application/json" \
-d '{"challenge_token":"chl_..."}'
# 3. Vérifier l'OTP → session complète
curl $BASE_URL/api/v1/console/verify/login-otp -X POST -H "Content-Type: application/json" \
-d '{"challenge_token":"chl_...","code":"123456"}'

Les routes protégées de la console exigent ensuite l’en-tête Authorization: Bearer <console_token>.

La console système (/api/v1/console/system/*) est la surface super-admin de toute la plateforme. Un compte est super-admin lorsque son champ is_system vaut vrai — c’est le seul booléen qui distingue un compte.

Elle expose, entre autres, des compteurs de plateforme et des lectures globales :

MéthodeCheminRôle
GET/system/fetch/statsCompteurs (espaces, admins, tenants, opérateurs, affectations en attente)
GET/system/fetch/workspacesTous les espaces de travail
GET/system/fetch/tenantsTous les tenants (?status=active|suspended)
GET/system/fetch/adminsTous les comptes (hachages exclus)
POST/system/suspend/tenantSuspension à l’échelle plateforme
POST/system/reactivate/tenantRéactivation

Trois façons de créer un compte is_system, de la plus forte à la plus faible :

  1. Seed déterministe (recommandé). Définissez SYSTEM_ADMIN_EMAIL + SYSTEM_ADMIN_PASSWORD (et l’optionnel SYSTEM_ADMIN_DISPLAY_NAME). Au démarrage, le relais s’assure qu’un super-admin connectable existe. Idempotent : un compte déjà présent est promu sur place et son mot de passe n’est jamais réinitialisé. Pour l’exécuter à la demande, sans redéploiement :

    Fenêtre de terminal
    ENV=production python3 bash/seeds/bootstrap-system-admin.py \
    --email ops@bloonio.com --password '<mot-de-passe-fort>'

    Sans --email/--password, le script retombe sur SYSTEM_ADMIN_EMAIL / SYSTEM_ADMIN_PASSWORD du .env sélectionné par ENV.

  2. Liste d’autorisation. Les e-mails de la csv SYSTEM_ADMIN_EMAILS deviennent is_system dès qu’ils s’inscrivent ou se connectent (ils choisissent leur propre mot de passe).

  3. Trappe de secours runtime. Promouvoir un compte existant via la clé admin :

    Fenêtre de terminal
    curl "$BASE_URL/api/v1/console/promote/console-admin?email=ops@bloonio.com" \
    -X POST -H "X-Admin-Key: YOUR_ADMIN_KEY"