簡體   English   中英

Flutter 承載令牌刷新

[英]Flutter Bearer Token Refresh

我想從 api 打印數據,所以我需要在每次過期時刷新不記名令牌,所以我如何使用下面的代碼在每次過期時刷新令牌。 您的幫助將不勝感激。 我有一個 function,我在其中獲取名為 getToken() 的令牌,我在那里使用該令牌作為響應,並在我的 signInData() 中使用它從 api 獲取數據,現在我想在該令牌過期時更新它,請檢查我的代碼如下

getToken function 我在r.data上得到了null,請告訴我哪里做錯了

Future<void> getToken([data]) async {
    
    String basicAuth =
        'Basic ${base64Encode(utf8.encode('$username:$password'))}';
    print(basicAuth);

    Response r = await _dio.post('$_baseUrl/services/token',
        // headers: <String, String>{'authorization': basicAuth});
        options: Options(headers: {"authorization": basicAuth}));

    print("status code");
    print(r.statusCode);
    print(data);
    print("data:" + r.data);
  }

登錄數據 function

  Future<void> signInData([data]) async {
    try {
      Response response = await _dio.post('$_baseUrl/api/gateway',
          data: {
            {
              "ClientPackageId": "0cdd231a-d7ad-4a68-a934-d373affb5100",
              "PlatformId": "ios",
              "ClientUserId": "AhmedOmar",
              "VinNumber": VINumber
            }
          },
          options: Options(headers: {
            "Content-Type": "application/json",
            "Authorization":
                "Bearer 2HDqoyEa1hkH9FXcUM04M2o010UWAKTgqJnCEVjIwLFlE7pTqhui2flMnW71pnl77ns4iBrE6KQ1dRXd2x9r4ImXX7",
          }));
      print(response.data);
      print(response.statusCode);
    } catch (e) {
      print(e);
    }
  }

嘿,如果 statusCode ==401` 那么首先調用您刷新令牌 api 並使用更新的令牌調用 signInData,有關共享首選項的更多詳細信息,請閱讀此處

我建議您閱讀如何將RetrofitDio package 一起使用

示例代碼如下 -

Future<void> signInData([data]) async {
final prefs = await SharedPreferences.getInstance();
final String token = prefs.getString('token') ?? "";

    try {
      Response response = await _dio.post('$_baseUrl/api/gateway',
          data: {
            {
              "ClientPackageId": "0cdd231a-d7ad-4a68-a934-d373affb5100",
              "PlatformId": "ios",
              "ClientUserId": "AhmedOmar",
              "VinNumber": VINumber
            }
          },
          options: Options(headers: {
            "Content-Type": "application/json",
            "Authorization":
                "Bearer $token",
          }));
      print(response.data);
      print(response.statusCode);
 if(response.statusCode == 401){
   // call your refresh token api here and save it in shared preference
    await getToken();
    signInData(data); 
}
    } catch (e) {
      print(e);
    }
  }

這是刷新令牌 api 方法

    Future<void> getToken() async {
    
    String basicAuth =
        'Basic ${base64Encode(utf8.encode('$username:$password'))}';
    print(basicAuth);

    Response r = await _dio.post('$_baseUrl/services/token',
        // headers: <String, String>{'authorization': basicAuth});
        options: Options(headers: {"authorization": basicAuth}));

    print("status code");
    print(r.statusCode);
    print(data);
    print("data:" + r.data);
   // Save your token here 
   final prefs = await SharedPreferences.getInstance();
   await prefs.setString("token", r.data["Token"]);
  }

暫無
暫無

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

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