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:
181
API_AUTH_DOC.md
Normal file
181
API_AUTH_DOC.md
Normal 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",
|
||||
...
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user