Flutter looping while i trying refresh token with dio interceptors

Viewed 28

While i trying refresh my token with interceptors, its always looping. I dont know why. Firstly i want to show my code;

  class ApiService {
  final Dio _dio = Dio();
  final Dio tokenDio = Dio();
  int tryCount = 0;

  String? accessToken;
  String? refreshToken;

  final _storage = const FlutterSecureStorage();

  ApiService() {
    _dio.options.baseUrl = ApiConstants.baseUrl;
    tokenDio.options = _dio.options;
    _storage.read(key: "token").then((value) => accessToken = value);
    _storage.read(key: "refreshToken").then((value) => refreshToken = value);
    _dio.interceptors.add(
      QueuedInterceptorsWrapper(
        onError: (DioError error, ErrorInterceptorHandler handler) async {
          if (error.response?.statusCode == 401) {
            log("Hata Aldık! ${error.requestOptions.path}");
            RequestOptions options = error.response!.requestOptions;
            if ("Bearer $accessToken" != options.headers[HttpHeaders.authorizationHeader]) {
              log("token farklıydı! $accessToken / ${options.headers[HttpHeaders.authorizationHeader]} ");
              options.headers[HttpHeaders.authorizationHeader] = "Bearer $accessToken";
              _dio.fetch(options).then(
                (value) => handler.resolve(value),
                onError: (e) {
                  log("error on resolve");
                  handler.reject(e);
                },
              );
              return;
            }
            _dio
                .get("/Auth/RefreshTokenLogin?refreshToken=${Uri.encodeQueryComponent(refreshToken!)}")
                .then((response) async {
              log("Token Refreshlendi!");

              if (response.statusCode == 200) {
                final RefreshTokenResponseModel? model = RefreshTokenResponseModel.fromJson(response.data);

                _storage.write(key: "token", value: model!.data!.token);
                _storage.write(key: "refreshToken", value: model.data!.refreshToken);
                refreshToken = model.data!.refreshToken;
                accessToken = model.data!.token;
                options.headers[HttpHeaders.authorizationHeader] = "Bearer ${model.data!.token}";
                tokenDio.options.headers = options.headers;

                // await UserSecureStorage.setField("token", model!.data!.token);
                // await UserSecureStorage.setField("refreshToken", model.data!.refreshToken);

                // final AuthService _authService = AuthService();
                // await _authService.registerDevice();

                if (model.data != null && model.data!.contractsToBeApproved!.isNotEmpty) {
                  final AuthController authController = Get.Get.find();
                  authController.contractsToBeApproved.value = model.data!.contractsToBeApproved!;
                }

                _dio.fetch(options).then(
                  (value) => handler.resolve(value),
                  onError: (e) {
                    handler.reject(e);
                  },
                );
                return;
              }
              return;
            });
          }
          return handler.next(error);
 
        },
        onRequest: (RequestOptions options, RequestInterceptorHandler handler) {
          log("istek atıldı.  ${options.path}");

          if (accessToken == null) {
            _storage.read(key: "token").then((value) {
              log("storage readed $value");
              accessToken = value;
              options.headers[HttpHeaders.authorizationHeader] = "Bearer $value";
              tokenDio.options.headers = options.headers;
              handler.next(options);
            });
          } else {
            options.headers[HttpHeaders.authorizationHeader] = "Bearer $accessToken";
            return handler.next(options);
          }
        },
      ),
    ); 
  }

Its my ApiService. And my goal is refreshing token. It might have multiple request in same time so I used "QueuedInterceptorsWrapper". After token expire, Its entering to error handler function and logging "Token Refreslendi" after token refresh api call.But after that if i click something for api call its looping infinitely. Whats wrong with my code ? Thanks for help :)

0 Answers
Related