Служба аутентификации HTTP Flutter для обновления токена oauth2

Я работаю над аутентификацией oauth2 в приложении flutter. Я думаю об обновлении токена, когда в любом из моих API возникает ошибка аутентификации 401. Итак, как добавить службу аутентификации ко всем HTTP-запросам во флаттере. В android у нас есть аутентификатор okhttp, который обнаруживает ошибку аутентификации во время любого вызова API и может обновить токен и продолжить предыдущий вызов API. В флаттере, как это реализовать? Я не думаю, что обрабатывать ошибку 401 во всех API - это хорошая практика.


person MohdNaseem    schedule 15.09.2019    source источник


Ответы (2)


Использовать диоперехватчик

Ниже приведен фрагмент моего перехватчика.

 dio.interceptors
        .add(InterceptorsWrapper(onRequest: (RequestOptions options) async {

/* Write your request logic setting your Authorization header from prefs*/

      String token = await prefs.accessToken;
      if (token != null) {
        options.headers["Authorization"] = "Bearer " + token;
      return options; //continue
    }, onResponse: (Response response) async {
// Write your response logic

      return response; // continue
    }, onError: (DioError dioError) async {

      // Refresh Token
      if (dioError.response?.statusCode == 401) {
        Response response;
        var data = <String, dynamic>{
          "grant_type": "refresh_token",
          "refresh_token": await prefs.refreshToken,
          'email': await prefs.userEmail
        };
        response = await dio
            .post("api/url/for/refresh/token", data: data);
        if (response.statusCode == 200) {
          var newRefreshToken = response.data["data"]["refresh_token"]; // get new refresh token from response
          var newAccessToken = response.data["data"]["access_token"]; // get new access token from response
          prefs.refreshToken = newRefreshToken;
          prefs.accessToken = newAccessToken; // to be used in the request section of the interceptor
          return dio.request(dioError.request.baseUrl + dioError.request.path,
              options: dioError.request);
        }
      }
      return dioError;
    }));
    return dio;
  }
}
person user6264291    schedule 27.08.2020

Я обычно использую шаблон параметризации всех вызовов API на стороне клиента, например этот фрагмент кода. Этот подход должен работать в любой технологии, хотя в некоторых технологиях у вас могут быть варианты реализации его через какой-то класс-перехватчик.

person Gary Archer    schedule 17.09.2019
comment
Да, я ожидаю того же поведения во время трепета. Я думаю, что диодный пакет выполняет те же функции - person MohdNaseem; 28.09.2019