|
|
|
|
@@ -83,7 +83,8 @@ class SecureTokenStorage {
|
|
|
|
|
/// Récupère la date d'expiration du refresh token
|
|
|
|
|
Future<DateTime?> getRefreshTokenExpirationDate() async {
|
|
|
|
|
try {
|
|
|
|
|
final expiresAtString = await _storage.read(key: _refreshExpiresAtKey);
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
final expiresAtString = prefs.getString(_refreshExpiresAtKey);
|
|
|
|
|
if (expiresAtString == null) return null;
|
|
|
|
|
|
|
|
|
|
return DateTime.parse(expiresAtString);
|
|
|
|
|
@@ -133,9 +134,10 @@ class SecureTokenStorage {
|
|
|
|
|
/// Met à jour le token d'accès
|
|
|
|
|
Future<void> updateAccessToken(String accessToken, DateTime expiresAt) async {
|
|
|
|
|
try {
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
await Future.wait([
|
|
|
|
|
_storage.write(key: _accessTokenKey, value: accessToken),
|
|
|
|
|
_storage.write(key: _expiresAtKey, value: expiresAt.toIso8601String()),
|
|
|
|
|
prefs.setString(_accessTokenKey, accessToken),
|
|
|
|
|
prefs.setString(_expiresAtKey, expiresAt.toIso8601String()),
|
|
|
|
|
]);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
throw StorageException('Erreur lors de la mise à jour du token d\'accès: $e');
|
|
|
|
|
@@ -145,8 +147,9 @@ class SecureTokenStorage {
|
|
|
|
|
/// Vérifie si les données d'authentification existent
|
|
|
|
|
Future<bool> hasAuthData() async {
|
|
|
|
|
try {
|
|
|
|
|
final accessToken = await _storage.read(key: _accessTokenKey);
|
|
|
|
|
final refreshToken = await _storage.read(key: _refreshTokenKey);
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
final accessToken = prefs.getString(_accessTokenKey);
|
|
|
|
|
final refreshToken = prefs.getString(_refreshTokenKey);
|
|
|
|
|
return accessToken != null && refreshToken != null;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return false;
|
|
|
|
|
@@ -184,12 +187,13 @@ class SecureTokenStorage {
|
|
|
|
|
/// Efface toutes les données d'authentification
|
|
|
|
|
Future<void> clearAuthData() async {
|
|
|
|
|
try {
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
await Future.wait([
|
|
|
|
|
_storage.delete(key: _accessTokenKey),
|
|
|
|
|
_storage.delete(key: _refreshTokenKey),
|
|
|
|
|
_storage.delete(key: _userInfoKey),
|
|
|
|
|
_storage.delete(key: _expiresAtKey),
|
|
|
|
|
_storage.delete(key: _refreshExpiresAtKey),
|
|
|
|
|
prefs.remove(_accessTokenKey),
|
|
|
|
|
prefs.remove(_refreshTokenKey),
|
|
|
|
|
prefs.remove(_userInfoKey),
|
|
|
|
|
prefs.remove(_expiresAtKey),
|
|
|
|
|
prefs.remove(_refreshExpiresAtKey),
|
|
|
|
|
]);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
throw StorageException('Erreur lors de l\'effacement des données d\'authentification: $e');
|
|
|
|
|
@@ -199,7 +203,8 @@ class SecureTokenStorage {
|
|
|
|
|
/// Active/désactive l'authentification biométrique
|
|
|
|
|
Future<void> setBiometricEnabled(bool enabled) async {
|
|
|
|
|
try {
|
|
|
|
|
await _storage.write(key: _biometricEnabledKey, value: enabled.toString());
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
await prefs.setBool(_biometricEnabledKey, enabled);
|
|
|
|
|
} catch (e) {
|
|
|
|
|
throw StorageException('Erreur lors de la configuration biométrique: $e');
|
|
|
|
|
}
|
|
|
|
|
@@ -208,8 +213,8 @@ class SecureTokenStorage {
|
|
|
|
|
/// Vérifie si l'authentification biométrique est activée
|
|
|
|
|
Future<bool> isBiometricEnabled() async {
|
|
|
|
|
try {
|
|
|
|
|
final enabled = await _storage.read(key: _biometricEnabledKey);
|
|
|
|
|
return enabled == 'true';
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
return prefs.getBool(_biometricEnabledKey) ?? false;
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
@@ -218,7 +223,8 @@ class SecureTokenStorage {
|
|
|
|
|
/// Efface toutes les données stockées
|
|
|
|
|
Future<void> clearAll() async {
|
|
|
|
|
try {
|
|
|
|
|
await _storage.deleteAll();
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
await prefs.clear();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
throw StorageException('Erreur lors de l\'effacement de toutes les données: $e');
|
|
|
|
|
}
|
|
|
|
|
@@ -227,8 +233,8 @@ class SecureTokenStorage {
|
|
|
|
|
/// Vérifie si le stockage sécurisé est disponible
|
|
|
|
|
Future<bool> isAvailable() async {
|
|
|
|
|
try {
|
|
|
|
|
await _storage.containsKey(key: 'test');
|
|
|
|
|
return true;
|
|
|
|
|
final prefs = await _prefs;
|
|
|
|
|
return prefs.containsKey('test');
|
|
|
|
|
} catch (e) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|