Android JWT刷新令牌流

时间:2017-12-21 03:56:50

标签: android android-asynctask jwt

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

这是我的流程的后续图表 服务器发出访问令牌和刷新令牌。这些过期时间为1小时和3天。这些令牌将保存到共享偏好中。

enter image description here

以上是图表的说明。

当访问令牌过期时,http调用将失败并显示401错误 所以我实现了getAccessToken()来重新创建访问令牌。

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

这是我的代码段。

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提取常用功能有什么好的做法?

1 个答案:

答案 0 :(得分:1)

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

相关问题