- README, PROTOCOL, FINDINGS, endpoints, rapport et outils traduits en français - docs/DISCLOSURE.md : courriel prêt à envoyer à hello@boti.education (compte démo codé en dur, transmission en clair, logging de production) - extract_endpoints.py vérifié après traduction (100 points d'accès toujours extraits)
102 lines
3.7 KiB
Markdown
102 lines
3.7 KiB
Markdown
# Boti Education app API : protocole (variante Green Wood School)
|
|
|
|
Rétro-ingénierie statique à partir de com.botieducation.greenwood 2.4.14
|
|
(bundle Capacitor/Ionic/Angular), vérifiée avec un seul appel de connexion
|
|
réel le 2026-09-01.
|
|
|
|
## URL de base
|
|
|
|
https://boti.education/p/greenwood/botiapi/
|
|
|
|
Motif par école : https://boti.education/p/<slug-école>/botiapi/
|
|
Tous les établissements Boti Education partagent un même backend. Hôte
|
|
média : media.boti.education (URLs signées à durée limitée, token dans le
|
|
chemin).
|
|
|
|
## Authentification
|
|
|
|
### Connexion
|
|
|
|
POST {base}/login Content-Type: multipart/form-data
|
|
|
|
Champs :
|
|
- login numéro de téléphone, ex. 06xxxxxxxx
|
|
- password en clair
|
|
- privacy booléen ("true"/"false")
|
|
- remembreMe bool
|
|
|
|
Réponse (HTTP 200, application/json) :
|
|
|
|
{
|
|
"status": 200, "msg": "Bienvenue !", "error": false,
|
|
"keyToken": "<40 caractères hex>", // clé de session
|
|
"userId": "20887",
|
|
"parentId": "1376", // quand role=parent
|
|
"eleveId": "1739",
|
|
"_acces": "parent", "role": "parent",
|
|
"eleves": [ { id, nomcomplet, prenom, nom, datenaissance, sexe,
|
|
niveau, img, parent_nom, parent_image } ],
|
|
"parent": { id, nomcomplet, tel, email, sexe, image },
|
|
"accessToken": "<jwt>", // présent sur certains comptes, peut être vide
|
|
"refreshToken": "<jwt>"
|
|
}
|
|
|
|
Erreurs : {"error": true, "msg": "..."} avec HTTP 200.
|
|
|
|
### Utilisation de la session sur chaque appel suivant
|
|
|
|
- GET : paramètres d'URL, plus key=<keyToken> et user_id=<userId>
|
|
- POST : champs multipart/form-data, plus key=<keyToken>
|
|
- Voie moderne optionnelle (prise en charge par l'ApiService, souvent vide
|
|
pour les comptes parents) : en-têtes Authorization: Bearer <accessToken> et
|
|
X-refresh-token: Bearer <refreshToken>
|
|
|
|
### Contrôle de session côté serveur
|
|
|
|
- Toute réponse contenant "disconnect": true signifie que la session a été
|
|
tuée (l'app navigue vers la page de connexion).
|
|
- "redirect": "<chemin>" fait naviguer l'app vers ce chemin.
|
|
- "showSLides": "<clé>" ouvre une modale de diapositives (écrans d'accueil ou
|
|
d'actualités).
|
|
|
|
## Enveloppe des requêtes
|
|
|
|
Paramètres GET observés dans le bundle (par fonctionnalité, sous-ensemble) :
|
|
user_id, key, acces, versionCode, versionNumber, paltform (sic, la faute de
|
|
frappe est dans l'app), eleveId, lang, date, startDate, endDate, classe, id,
|
|
search, page
|
|
|
|
Conventions POST (FormData) :
|
|
- champs plats ajoutés comme clé=valeur
|
|
- objet imbriqué -> clé[sous-clé]=valeur
|
|
- tableau -> clé[0]=..., clé[1]=...
|
|
- File/Blob -> ajouté brut sous le nom du champ
|
|
- key=<keyToken> ajouté automatiquement par l'ApiService
|
|
|
|
## Notifications push
|
|
|
|
POST {base}/device_token champs : token=<jeton fcm>, user_id, key, uid=<uuid appareil>
|
|
|
|
## Inventaire des points d'accès
|
|
|
|
Voir endpoints.md (100 points d'accès de l'app, méthodes get/post et chunk
|
|
source par point d'accès). Les noms sont stables et ajoutés tels quels à
|
|
l'URL de base.
|
|
|
|
## Médias / fichiers
|
|
|
|
- Fichiers et images servis par media.boti.education avec un chemin signé à
|
|
durée limitée (token base64url + horodatage ajoutés).
|
|
- Les PDF sont ouverts en interne via pdf.js (chunk 7482.js).
|
|
- getBlob(path, params, absolute) télécharge les blobs bruts pour les pièces
|
|
jointes.
|
|
|
|
## Particularités
|
|
|
|
- L'ApiService ajoute le nom du point d'accès comme chaîne brute : les noms
|
|
du tableau sont la route serveur complète (pas de préfixe /api, pas de .php).
|
|
- La coquille de paramètre « paltform » est envoyée par l'app ; le serveur
|
|
l'accepte, ne pas la « corriger » aveuglément.
|
|
- Des console.log détaillés (paramètres, en-têtes) subsistent dans la version
|
|
de production.
|