【问题标题】:Android JWT refresh token flowAndroid JWT 刷新令牌流程
【发布时间】:2018-06-03 16:54:01
【问题描述】:

我正在 Android 上使用 jwt 实现代码。
在使用刷新令牌时,我不确定我的代码是否正确。

这是我的流程的顺序图。
服务器发出访问令牌和刷新令牌。这些过期时间为 1 小时 3 天。这些令牌被保存到 sharedpreferences。

这是上图的描述。

访问令牌过期后,http 调用将失败并返回 401 错误。
所以我实现了getAccessToken() 来更新访问令牌。

(1):一个 AsyncTask 用于整个 http 调用步骤。
- 我的 AsyncTask 太大,我想重构它。
(2) : (1) 的 AynsTask 有重新获取访问令牌的逻辑。
- 这个逻辑重复了我所有的 HTTP 调用函数。
(3):更新访问令牌后,我的应用重新尝试调用 /api/foo - 要重试,递归调用 AsyncTask 的doBackground() 函数。

这是我的代码 sn-p。

class ApplyCheck extends AsyncTask<String, Void, ResponseTypeEnum> {
    private List<ApplyEntity> applyEntityList = null;

    @Override
    protected ResponseTypeEnum doInBackground(String... strings) {
        try {
            response = restManager.getApplyList(strings[0],"","","");  // call /api/foo
        } catch (RestRuntimeException e) {
            return ResponseTypeEnum.SERVER_ERROR;
        }

        switch (response.code()) {
            case 200:
                //set applyEntityList
                ....
                return ResponseTypeEnum.SUCCESS;
            case 401:
                //<-- This routine is duplcated all my AsyncTasks
                if(getAccessToken()) {
                    //<-- recursive call to re-call api 
                    return doInBackground(strings);
                } else {
                    return ResponseTypeEnum.TOKEN_EXPIRE;
                }
        }
    }

    //re-issue new access token
    private boolean getAccessToken() {
        Response response = restManager.getAccessToken();  // call /auth/issue-token
        if(response.code() == 200) {
            String tokens = response.body().string();
            JSONObject jsonObject = new JSONObject(tokens);
            sharedPreferences.edit().putString("accessToken", jsonObject.getString("accessToken"));
            sharedPreferences.edit().putString("refreshToken", jsonObject.getString("refreshToken"));
            return true;
        } else {
            return false;
        }  

我的问题
1.我的方法正确吗?如果没有,请告诉我好的做法。
2. 如果是,为我重复的 AsyncTasks 提取常用功能有什么好的做法吗?

【问题讨论】:

    标签: android android-asynctask jwt


    【解决方案1】:

    恕我直言,您的流程很好。唯一的变化是我将递归调用 doInBackground。您所做的事情是可行的,但它违反了 doInBackground 的意图。而是修改您的 AsyncTask 以处理 onPostExecute 中的不同响应(即链接您的请求),并使用每个用例的相关参数再次调用 AsyncTask。这将使维护变得更加容易,因为您可以向 AsyncTask 添加特定方法以应对每种响应类型,并且可以查看它是如何以线性方式触发的。如果您需要更新 onProgressUpdate,您还应该将进度值传递给链接的 AsyncTask 调用,以便它可以保持进度的一致性。否则它将在每次调用时不断重启。

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 2017-07-18
      • 2016-03-05
      • 2016-06-25
      • 1970-01-01
      • 2021-04-06
      • 2017-10-11
      • 2016-10-14
      • 2020-11-26
      相关资源
      最近更新 更多