Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save Adrek/dc2752d8165edc0df9b63bb26b3058e3 to your computer and use it in GitHub Desktop.
Save Adrek/dc2752d8165edc0df9b63bb26b3058e3 to your computer and use it in GitHub Desktop.
Auth Refresh token retry interceptor for flutter with Dio Package
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