add secure storage (not working)
This commit is contained in:
@@ -1,13 +1,16 @@
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
import 'package:mileograph_flutter/objects/objects.dart';
|
||||
import 'package:mileograph_flutter/services/apiService.dart';
|
||||
import 'package:shared_preferences/shared_preferences.dart';
|
||||
|
||||
class AuthService extends ChangeNotifier {
|
||||
final ApiService api;
|
||||
static const _tokenKey = 'auth_token';
|
||||
bool _restoring = false;
|
||||
|
||||
// secure storage instance
|
||||
final FlutterSecureStorage _storage = const FlutterSecureStorage();
|
||||
|
||||
AuthService({required this.api});
|
||||
|
||||
AuthenticatedUserData? _user;
|
||||
@@ -73,9 +76,10 @@ class AuthService extends ChangeNotifier {
|
||||
if (_restoring || _user != null) return;
|
||||
_restoring = true;
|
||||
try {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
final token = prefs.getString(_tokenKey);
|
||||
// read token from secure storage
|
||||
final token = await _storage.read(key: _tokenKey);
|
||||
if (token == null || token.isEmpty) return;
|
||||
|
||||
final userResponse = await api.get(
|
||||
'/users/me',
|
||||
headers: {
|
||||
@@ -83,6 +87,7 @@ class AuthService extends ChangeNotifier {
|
||||
'accept': 'application/json',
|
||||
},
|
||||
);
|
||||
|
||||
setLoginData(
|
||||
userId: userResponse['user_id'],
|
||||
username: userResponse['username'],
|
||||
@@ -98,13 +103,11 @@ class AuthService extends ChangeNotifier {
|
||||
}
|
||||
|
||||
Future<void> _persistToken(String token) async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.setString(_tokenKey, token);
|
||||
await _storage.write(key: _tokenKey, value: token);
|
||||
}
|
||||
|
||||
Future<void> _clearToken() async {
|
||||
final prefs = await SharedPreferences.getInstance();
|
||||
await prefs.remove(_tokenKey);
|
||||
await _storage.delete(key: _tokenKey);
|
||||
}
|
||||
|
||||
Future<void> register({
|
||||
@@ -126,9 +129,13 @@ class AuthService extends ChangeNotifier {
|
||||
await api.postForm('/register', formData);
|
||||
}
|
||||
|
||||
void logout() {
|
||||
Future<void> handleTokenExpired() async {
|
||||
_user = null;
|
||||
_clearToken();
|
||||
await _clearToken();
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
void logout() {
|
||||
handleTokenExpired(); // reuse
|
||||
}
|
||||
}
|
||||
|
||||
36
lib/services/tokenStorageService.dart
Normal file
36
lib/services/tokenStorageService.dart
Normal file
@@ -0,0 +1,36 @@
|
||||
import 'package:flutter_secure_storage/flutter_secure_storage.dart';
|
||||
|
||||
class TokenStorageService {
|
||||
// Singleton pattern (optional but usually handy for services)
|
||||
TokenStorageService._internal();
|
||||
|
||||
static final TokenStorageService _instance = TokenStorageService._internal();
|
||||
|
||||
factory TokenStorageService() => _instance;
|
||||
|
||||
static const _tokenKey = 'auth_token';
|
||||
|
||||
// Use const constructor for secure storage
|
||||
final FlutterSecureStorage _storage = const FlutterSecureStorage();
|
||||
|
||||
/// Save or update the token
|
||||
Future<void> setToken(String token) async {
|
||||
await _storage.write(key: _tokenKey, value: token);
|
||||
}
|
||||
|
||||
/// Retrieve the stored token (null if none)
|
||||
Future<String?> getToken() async {
|
||||
return _storage.read(key: _tokenKey);
|
||||
}
|
||||
|
||||
/// Delete the token
|
||||
Future<void> clearToken() async {
|
||||
await _storage.delete(key: _tokenKey);
|
||||
}
|
||||
|
||||
/// Optional: check quickly if a token exists
|
||||
Future<bool> hasToken() async {
|
||||
final token = await getToken();
|
||||
return token != null && token.isNotEmpty;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user