feat(online): session compte, stockage sécurisé et adapter API (ticket #64)

Ajoute l'adapter API distant (infrastructure/remote/auth_api.dart,
http_api_client.dart) et le stockage sécurisé du token d'auth
(infrastructure/security/secure_storage_auth_token_store.dart), câblés
dans app_bootstrap.dart. Étend le modèle Drift (migration
schemaVersion 9→10) et la couche application (ports, use cases,
entités) pour la session de compte. flutter pub get OK (ajout http,
flutter_secure_storage), build_runner OK, dart format appliqué,
analyze propre (mêmes infos préexistantes), 109/109 tests verts,
build APK debug validé. Premier ticket du chantier "Ajouter les
features serveur au client" (#63).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 21:25:49 +02:00
parent a557708273
commit e60c8bbdb8
19 changed files with 1799 additions and 7 deletions

View File

@ -0,0 +1,44 @@
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
import '../../application/application.dart';
final class SecureStorageAuthTokenStore implements AuthTokenStore {
const SecureStorageAuthTokenStore({
FlutterSecureStorage storage = const FlutterSecureStorage(),
}) : _storage = storage;
static const _tokenKey = 'gametime.auth.token';
static const _expiresAtKey = 'gametime.auth.expiresAt';
final FlutterSecureStorage _storage;
@override
Future<void> saveToken(String token, DateTime expiresAt) async {
await _storage.write(key: _tokenKey, value: token);
await _storage.write(
key: _expiresAtKey,
value: expiresAt.toUtc().toIso8601String(),
);
}
@override
Future<String?> readToken() async {
final token = await _storage.read(key: _tokenKey);
final expiresAtValue = await _storage.read(key: _expiresAtKey);
if (token == null || expiresAtValue == null) {
return token;
}
final expiresAt = DateTime.tryParse(expiresAtValue)?.toUtc();
if (expiresAt != null && !expiresAt.isAfter(DateTime.now().toUtc())) {
await clearToken();
return null;
}
return token;
}
@override
Future<void> clearToken() async {
await _storage.delete(key: _tokenKey);
await _storage.delete(key: _expiresAtKey);
}
}

View File

@ -0,0 +1 @@
export 'secure_storage_auth_token_store.dart';