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/auth_service.dart';
import 'package:marco/helpers/services/api_endpoints.dart'; import 'package:marco/helpers/services/api_endpoints.dart';
import 'package:marco/helpers/services/storage/local_storage.dart'; import 'package:marco/helpers/services/storage/local_storage.dart';
import 'package:jwt_decoder/jwt_decoder.dart';
final Logger logger = Logger(); final Logger logger = Logger();
class ApiService { class ApiService {
@ -19,7 +19,43 @@ class ApiService {
static Future<String?> _getToken() async { static Future<String?> _getToken() async {
final token = await LocalStorage.getJwtToken(); final token = await LocalStorage.getJwtToken();
if (token == null && enableLogs) logger.w("No JWT token found.");
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; return token;
} }

View File

@ -70,6 +70,7 @@ dependencies:
percent_indicator: ^4.2.2 percent_indicator: ^4.2.2
flutter_contacts: ^1.1.9+2 flutter_contacts: ^1.1.9+2
photo_view: ^0.15.0 photo_view: ^0.15.0
jwt_decoder: ^2.0.1
dev_dependencies: dev_dependencies:
flutter_test: flutter_test:
sdk: flutter sdk: flutter