Flutter HTTP身份验证器服务以刷新oauth2令牌

时间:2019-09-15 05:16:23

标签: http authentication flutter oauth-2.0 refresh-token

我正在Flutter应用程序中进行oauth2身份验证。我正在考虑在我的任何API中发生401身份验证错误时刷新令牌。因此,如何为flutter中的所有http请求添加身份验证器服务。在android中,我们具有okhttp authenticator来检测任何API调用期间的身份验证错误,并且可以刷新令牌并继续之前的API调用。在扑中如何实现呢?我认为在所有API中处理401错误都不是一个好习惯。

2 个答案:

答案 0 :(得分:2)

使用dio拦截器

下面是我的拦截器的一个片段

 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;
  }
}

答案 1 :(得分:1)

我倾向于使用在客户端对所有API调用进行参数化的模式,如下面的链接(Android)中所示,即您所建议的行为。这适用于任何技术,尽管在某些技术中,您可以选择通过某种拦截器类来实现它:https://github.com/authguidance-examples/authguidance.mobilesample.android/blob/master/app/src/main/java/com/authguidance/basicmobileapp/plumbing/api/HttpClient.kt