Initial commit — Serveur Lucas SmartEye

API réception alertes chute (SmartEye/YOLO), analyse IA (Gemini 2.5 Flash),
gestion alertes avec escalade (watchdog), notifications Firebase,
dashboard web, documentation MkDocs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Debian
2026-03-14 21:26:06 +01:00
commit 24dbc7cd6a
64 changed files with 9677 additions and 0 deletions

181
API_AUTH_DOC.md Normal file
View File

@@ -0,0 +1,181 @@
# Documentation Authentification LucasApp
## Réponses aux questions
### 1. Quel endpoint doit recevoir/vérifier ce mot de passe ?
**Endpoint : `https://lucas.unigest.fr/api/auth.php`**
**Méthode :** POST
**Content-Type :** application/json
**Corps de la requête :**
```json
{
"client_id": "Demo_01",
"password": "75a9d2db3919",
"fcm_token": "fheHxyPRQlS7..." (optionnel)
}
```
**Réponse succès (200) :**
```json
{
"status": "success",
"message": "Authentification réussie",
"data": {
"token": "secret123",
"client_name": "Demo_01",
"senior_name": "Mamie Lucas",
"senior_nickname": "mamie",
"senior_photo": "photos/mamie.jpg",
"latitude": "42.1028",
"longitude": "9.5147",
"emergency_number": "15",
"contacts": [...],
"site_status": "active"
}
}
```
**Réponses erreur :**
- **400** : Identifiant ou mot de passe manquant
- **403** : Identifiant inconnu / Mot de passe incorrect / Compte non configuré
- **500** : Erreur serveur
---
### 2. Le mot de passe est-il haché côté serveur (bcrypt, SHA256) ou comparé en clair ?
**Réponse : BCRYPT**
- Le mot de passe est **haché avec bcrypt** (`password_hash($password, PASSWORD_BCRYPT)`)
- Le hash est stocké dans `database.json` sous le champ `password_hash`
- La vérification utilise `password_verify($password, $password_hash)`
- **Sécurité maximale** : même si database.json est compromis, les mots de passe ne peuvent pas être déchiffrés
---
### 3. Le flux voulu : le serveur génère le mot de passe et le donne au client, ou le client le choisit et le serveur le stocke ?
**Réponse : SERVEUR GÉNÈRE (recommandé)**
**Flux principal (production) :**
1. L'admin exécute `php generate_password.php Demo_01`
2. Le serveur génère un mot de passe aléatoire (12 caractères)
3. Le serveur affiche le mot de passe en clair (une seule fois)
4. L'admin le communique au client (QR code, SMS, email)
5. Le client le saisit dans LucasApp
6. L'app l'utilise pour s'authentifier via `/api/auth.php`
**Flux alternatif (si besoin) :**
- L'admin peut définir un mot de passe personnalisé avec `php set_password.php Demo_01 MonMotDePasse`
- Utile si le client veut choisir son propre mot de passe
---
## Intégration dans LucasApp
### Étape 1 : Configuration initiale
Quand l'utilisateur ouvre le dialog "Configurer le compte" :
- Demander `client_id` (ID du compte)
- Demander `password` (mot de passe fourni par l'admin)
### Étape 2 : Authentification
```dart
Future<void> _authenticate() async {
final response = await http.post(
Uri.parse('https://lucas.unigest.fr/api/auth.php'),
headers: {'Content-Type': 'application/json'},
body: jsonEncode({
'client_id': _clientId,
'password': _clientPassword,
'fcm_token': await FirebaseMessaging.instance.getToken(),
}),
);
if (response.statusCode == 200) {
final data = jsonDecode(response.body);
final token = data['data']['token'];
// Stocker le token + infos client dans SharedPreferences
await _prefs.setString('client_token', token);
await _prefs.setString('client_name', data['data']['client_name']);
await _prefs.setString('senior_name', data['data']['senior_name']);
// ... etc
} else {
// Erreur d'authentification
_showError('Identifiant ou mot de passe incorrect');
}
}
```
### Étape 3 : Enregistrement FCM token
Le token FCM est **automatiquement enregistré** lors de l'authentification si vous le passez dans le corps de la requête.
**Pas besoin d'appel séparé à `/api/register`** — tout se fait en une seule requête.
---
## Architecture complète
### SmartEye (Jetson) → Lucas
- **Endpoint :** `/api.php`
- **Auth :** `client_id` + `token` (en POST)
- **Usage :** Upload image de détection de chute
- **Inchangé** — SmartEye continue d'utiliser le token directement
### LucasApp (Flutter) → Lucas
- **Endpoint :** `/api/auth.php`
- **Auth :** `client_id` + `password` (en JSON)
- **Usage :** Authentification + récupération du token
- **Nouveau** — LucasApp utilise le mot de passe pour obtenir le token
### Sécurité
- **Mot de passe** : stocké haché (bcrypt) dans database.json
- **Token** : stocké en clair (car utilisé par SmartEye en POST)
- **Le mot de passe NE TRANSITE JAMAIS en clair** sur le réseau (HTTPS obligatoire)
---
## Commandes admin
### Générer un mot de passe aléatoire
```bash
sudo -u www-data php /var/www/lucas/admin/generate_password.php Demo_01
```
### Définir un mot de passe personnalisé
```bash
sudo -u www-data php /var/www/lucas/admin/set_password.php Demo_01 MonMotDePasse123
```
### Vérifier les mots de passe configurés
```bash
grep -A 2 '"name":' /var/www/lucas/database.json | grep -E '"name"|password_hash'
```
---
## Exemple de test curl
```bash
curl -X POST https://lucas.unigest.fr/api/auth.php \
-H "Content-Type: application/json" \
-d '{
"client_id": "Demo_01",
"password": "75a9d2db3919"
}'
```
**Réponse attendue :**
```json
{
"status": "success",
"message": "Authentification réussie",
"data": {
"token": "secret123",
...
}
}
```