Flutter while refreshToken getting old refresh token

Viewed 35

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.

enter image description here

  1. Request sent to notification.
  2. Request sent to therapist
  3. Get error on notification
  4. Request sent to PurchasedPackages
  5. Get error on PurchasedPackages
  6. Token refreshed. New token +pVX....
  7. Error on another instance of dio for refresh token without any interceptor.
  8. 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!

0 Answers
Related