簡體   English   中英

Flutter http 身份驗證器服務以刷新 oauth2 令牌

[英]Flutter http authenticator service to refresh oauth2 token

我正在 Flutter 應用程序中進行 oauth2 身份驗證。 我正在考慮在我的任何 API 中發生 401 身份驗證錯誤時刷新令牌。 那么如何給flutter中的所有http請求添加一個authenticator服務呢? 在android中,我們有okhttp身份驗證器來檢測任何API調用期間的身份驗證錯誤,並且可以刷新令牌並繼續之前的API調用。 在顫振中如何實現這一點? 我不認為在所有 API 中處理 401 錯誤是一個好習慣。

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

我傾向於在客戶端使用參數化所有 API 調用的模式, 如此代碼片段所示 這種方法應該適用於任何技術,但在某些技術中,您可能可以選擇通過某種攔截器類來實現它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM