feat: Implement JWT token expiration handling and refresh logic in ApiService

This commit is contained in:
Vaibhav Surve 2025-06-23 17:35:50 +05:30
parent 99a9b47a19
commit e71e4d633a
2 changed files with 42 additions and 5 deletions

View File

@ -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',

View File

@ -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