-
-
Save Adrek/dc2752d8165edc0df9b63bb26b3058e3 to your computer and use it in GitHub Desktop.
Auth Refresh token retry interceptor for flutter with Dio Package
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import 'dart:async'; | |
import 'package:dio/dio.dart'; | |
import 'package:flutter/foundation.dart'; | |
import 'package:sabsewa/networks/api_endpoints.dart'; | |
import 'package:sabsewa/app_config/app_colors.dart'; | |
import 'package:sabsewa/networks/secure_storage.dart'; | |
import 'package:flutter/material.dart'; | |
import 'package:sabsewa/views/utils/toast.dart'; | |
class AuthInterceptor extends InterceptorsWrapper { | |
final Dio loggedDio; //for logged | |
final Dio tokenDio; | |
// final Dio tokenDio; | |
final SecureStorage secureStorage; | |
AuthInterceptor({ | |
@required this.loggedDio, | |
@required this.tokenDio, | |
@required this.secureStorage, | |
}); | |
@override | |
Future onRequest(RequestOptions options) async { | |
options.headers['authorization'] = "Bearer ${await secureStorage.getAccessToken()}"; | |
return options; | |
} | |
@override | |
Future onError(DioError error) async { | |
if (error.response?.statusCode == 401) { | |
//This retries the request if the token was updated later on | |
final RequestOptions options = error.response.request; | |
_lockDio(); | |
//check if retry count is 1 (retry count gives number of attempt for refresh token renewable | |
if (options.headers['Retry-Count'] == 1) { | |
_unlockDio(); | |
// showFlutterToast(AppColors.secondaryColor(1), 'Unauthorized Access! Please login'); | |
secureStorage.removeData(); | |
//TODO: logout user here | |
return error; | |
} | |
//request for new refresh token | |
return tokenDio.post(APIPathHelper.authAPIs(APIPath.refreshToken), data: { | |
secureStorage.refreshToken: await secureStorage.getRefreshToken() ?? "" | |
}).then((response) { | |
secureStorage.setAccessToken(response.data[secureStorage.accessToken]); //overwriting existing expired token | |
secureStorage.setRefreshToken(response.data[secureStorage.refreshToken]); //overwriting existing expired refresh token | |
}).whenComplete(() { | |
_unlockDio(); | |
}).then((e) { | |
options.headers['Retry-Count'] = 1; //setting retry count to 1 to prevent further concurrent calls | |
return loggedDio.request(options.path, options: options); | |
}).catchError((e) { | |
// showFlutterToast(AppColors.secondaryColor(1), 'Unauthorized Access! Please login'); | |
secureStorage.removeData(); | |
//TODO: logout user here | |
return e; | |
}); | |
} else { | |
return error; | |
} | |
} | |
void _lockDio() { | |
loggedDio.lock(); | |
loggedDio.interceptors.responseLock.lock(); | |
loggedDio.interceptors.errorLock.lock(); | |
} | |
void _unlockDio() { | |
loggedDio.unlock(); | |
loggedDio.interceptors.responseLock.unlock(); | |
loggedDio.interceptors.errorLock.unlock(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment