Android JWT刷新令牌流

Android JWT刷新令牌流,android,android-asynctask,jwt,Android,Android Asynctask,Jwt,我正在Android上用jwt实现代码。 在使用刷新令牌时,我不确定我的代码是否正确 这是我的流程的顺序图。 服务器发出了访问令牌和刷新令牌。这些过期时间为1小时3天。这些令牌保存到SharedReferences 下面是上图的描述 当访问令牌过期时,http调用将失败,并出现401错误。 所以我实现了getAccessToken()来重新更新访问令牌 (1):一个异步任务用于整个http调用步骤。 -我的任务太大,我想重构它。 (2):(1)的AynTask具有重新获取访问令牌的逻辑。 -此

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

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

下面是上图的描述

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

(1):一个异步任务用于整个http调用步骤。
-我的任务太大,我想重构它。
(2):(1)的AynTask具有重新获取访问令牌的逻辑。
-此逻辑与我的所有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;
        }  
类ApplyCheck扩展了异步任务{
私有列表applyEntityList=null;
@凌驾
受保护的响应Equaneum doInBackground(字符串…字符串){
试一试{
response=restManager.getApplyList(字符串[0]、“”、“”、“”);//调用/api/foo
}捕获(重新运行异常e){
返回responseTypeNum.SERVER\u错误;
}
开关(response.code()){
案例200:
//设置applyEntityList
....
回报:成功;
案例401:

// 您拥有的流程很好。唯一的变化是我不会递归调用doInBackground。您所做的是可行的,但它违背了doInBackground的意图。而是修改您的AsyncTask以处理onPostExecute中的不同响应(即链接您的请求),并使用每个用例的相关参数再次调用AsyncTask。这将使维护变得更加容易,因为您可以向AsyncTask添加特定的方法来处理每个响应类型,并可以看到它是如何以线性方式触发的。如果您需要更新onProgressUpdate,还应该将进度值传递给链接的AsyncTaskk调用,这样它就可以保持进程的一致性。否则每次调用都会继续重新启动