I making refresh token with dio interceptors. Its working well but while i have multiple request in same time its trying using old refresh token. What can i do for fix it ? I tried use QueuedInterceptorsWrapper too but it has same result. Let me show you my codes first :
My Interceptor on constructor.
_dio.interceptors.add(
InterceptorsWrapper(onResponse: (Response<dynamic> response, ResponseInterceptorHandler handler) {
return handler.next(response);
}, onError: (DioError error, ErrorInterceptorHandler handler) async {
if (error.response?.statusCode == 401) {
var options = error.response!.requestOptions;
if ("Bearer $accessToken" != options.headers[HttpHeaders.authorizationHeader]) {
options.headers[HttpHeaders.authorizationHeader] = "Bearer $accessToken";
_dio.fetch(options).then((value) => handler.resolve(value), onError: (err) {
log("error on fetchiN!!!!");
});
// log("$accessToken ////// ${_dio.options.headers["Authorization"]}");
}
final refToken = await UserSecureStorage.getField("refreshToken");
if (refToken != null) {
log("hata alındı ${error.requestOptions.path}");
await refreshToken(refToken);
return handler.resolve(await _retry(error.requestOptions));
}
}
return handler.next(error);
}, onRequest: (RequestOptions options, RequestInterceptorHandler handler) async {
log("request atıldı ${options.path} ---Ref token => ${await UserSecureStorage.getField("refreshToken")}");
if (accessToken == null) {
accessToken = await UserSecureStorage.getField("token");
}
options.headers["Authorization"] = "Bearer $accessToken";
return handler.next(options);
}),
);
Refresh token function
Future<void> refreshToken(String? refreshToken) async {
final refToken = await UserSecureStorage.getField("refreshToken");
//In first request its changing and its working fine. But while it have multiple request in same time while in second request its trying use old refreshtoken
//token dio is another instance of dio so it hasnt any interceptor.Its only has baseurl.
final response = await tokenDio.get("/Auth/RefreshTokenLogin?
refreshToken=${Uri.encodeQueryComponent(refToken!)}");
if (response.statusCode == 200) {
final RefreshTokenResponseModel? model =
RefreshTokenResponseModel.fromJson(response.data);
accessToken = model!.data!.token;
log("refreshlendi! Yenisi => ${model.data!.refreshToken}");
await UserSecureStorage.setField("token", model.data!.token);
await UserSecureStorage.setField("refreshToken", model.data!.refreshToken);
_dio.options.headers[HttpHeaders.authorizationHeader] = "Bearer ${model.data!.token}";
}
}
Some screenshoots for make it clear.
- Request sent to notification.
- Request sent to therapist
- Get error on notification
- Request sent to PurchasedPackages
- Get error on PurchasedPackages
- Token refreshed. New token +pVX....
- Error on another instance of dio for refresh token without any interceptor.
- Refreshtoken instance tried refresh it with old refresh token.Ke.... So its gaving DioError on refreshtoken instance.
What can i do for fix it ? Thanks for response!
