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/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,10 +19,46 @@ 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.");
|
|
||||||
return token;
|
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) => {
|
static Map<String, String> _headers(String token) => {
|
||||||
'Content-Type': 'application/json',
|
'Content-Type': 'application/json',
|
||||||
'Authorization': 'Bearer $token',
|
'Authorization': 'Bearer $token',
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user