Flutter api persists the cookies in files, custom X-CSRF-TOKEN, csrf-cookie, XSRF-TOKEN

pubspec.yaml

  dio: ^3.0.10
  dio_cookie_manager: ^1.0.0
  path_provider: ^1.6.27
  cookie_jar: ^1.0.1

Init dio

  final Dio dio = Dio();
  PersistCookieJar cookieJar;


  Api() {
    if (!kReleaseMode) {
      dio.interceptors
          .add(LogInterceptor(responseBody: true, requestBody: true));
    }
    getApplicationDocumentsDirectory().then((Directory appDocDir) async {
      final String appDocPath = appDocDir.path;
      final String cookiePath = '$appDocPath/cookies';
      final Directory dir = Directory(cookiePath);
      await dir.create();
      cookieJar = PersistCookieJar(dir: cookiePath);
      dio.interceptors.add(CookieManager(cookieJar));
      dio.interceptors
          .add(InterceptorsWrapper(onResponse: (Response<dynamic> response) {
        final String urlPath = response.request.path;
        final List<Cookie> cookies =
            cookieJar.loadForRequest(Uri.parse(urlPath));
        final String xsrfToken = cookies
            .firstWhere((Cookie c) => c.name == 'XSRF-TOKEN',
                orElse: () => null)
            ?.value;
        // Set dio auth header token once time
        if (xsrfToken != null) {
          /// The XSRF-TOKEN got from cookie requires decoded before add to header
          dio.options.headers['X-XSRF-TOKEN'] = Uri.decodeComponent(xsrfToken);
          dio.options.headers['X-Requested-With'] = 'XMLHttpRequest';
          String cookieStr = '';
          for (int i = 0; i < cookies.length; i++) {
            final Cookie c = cookies[i];
            cookieStr += '${c.name}=${c.value}; ';
          }
          dio.options.headers['Cookie'] = cookieStr;
        }
        return response;
      }));
    });
  }

Leave a Reply

Your email address will not be published.Required fields are marked *