feat: Implement JWT token expiration handling and refresh logic in ApiService
This commit is contained in:
parent
99a9b47a19
commit
e71e4d633a
@ -7,7 +7,7 @@ import 'package:logger/logger.dart';
|
||||
import 'package:marco/helpers/services/auth_service.dart';
|
||||
import 'package:marco/helpers/services/api_endpoints.dart';
|
||||
import 'package:marco/helpers/services/storage/local_storage.dart';
|
||||
|
||||
import 'package:jwt_decoder/jwt_decoder.dart';
|
||||
final Logger logger = Logger();
|
||||
|
||||
class ApiService {
|
||||
@ -17,12 +17,48 @@ class ApiService {
|
||||
|
||||
// === Helpers ===
|
||||
|
||||
static Future<String?> _getToken() async {
|
||||
final token = await LocalStorage.getJwtToken();
|
||||
if (token == null && enableLogs) logger.w("No JWT token found.");
|
||||
return token;
|
||||
static Future<String?> _getToken() async {
|
||||
final token = await LocalStorage.getJwtToken();
|
||||
|
||||
if (token == null) {
|
||||
if (enableLogs) logger.w("No JWT token found.");
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
// Check if the token is expired
|
||||
if (JwtDecoder.isExpired(token)) {
|
||||
_log("Access token is expired. Attempting refresh...");
|
||||
final refreshed = await AuthService.refreshToken();
|
||||
if (refreshed) {
|
||||
return await LocalStorage.getJwtToken();
|
||||
} else {
|
||||
_log("Token refresh failed. Logging out...");
|
||||
await LocalStorage.logout();
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if token is about to expire in < 2 minutes
|
||||
final expirationDate = JwtDecoder.getExpirationDate(token);
|
||||
final now = DateTime.now();
|
||||
final difference = expirationDate.difference(now);
|
||||
|
||||
if (difference.inMinutes < 2) {
|
||||
_log("Access token is about to expire in ${difference.inSeconds}s. Refreshing...");
|
||||
final refreshed = await AuthService.refreshToken();
|
||||
if (refreshed) {
|
||||
return await LocalStorage.getJwtToken();
|
||||
}
|
||||
}
|
||||
|
||||
} catch (e) {
|
||||
_log("Token decoding error: $e");
|
||||
}
|
||||
|
||||
return token;
|
||||
}
|
||||
|
||||
static Map<String, String> _headers(String token) => {
|
||||
'Content-Type': 'application/json',
|
||||
'Authorization': 'Bearer $token',
|
||||
|
@ -70,6 +70,7 @@ dependencies:
|
||||
percent_indicator: ^4.2.2
|
||||
flutter_contacts: ^1.1.9+2
|
||||
photo_view: ^0.15.0
|
||||
jwt_decoder: ^2.0.1
|
||||
dev_dependencies:
|
||||
flutter_test:
|
||||
sdk: flutter
|
||||
|
Loading…
x
Reference in New Issue
Block a user