刷新令牌rxjava + retrofir2

时间:2018-04-20 06:34:37

标签: java android retrofit rx-java

在应用程序中注册时,用户获得2个令牌。访问(生活1天)和刷新(生活6个月)。在某个时刻,Access令牌将会到来 - 有一天会出现自定义错误。在这里,我们需要调用refreshToken方法和更新,然后工作将继续进行。 我们调用该方法,例如getdata,检查错误,如果自定义错误refreshToken,我们已经使用更新的令牌保持两个令牌getdata。

我尝试但是如何在刷新令牌后调用方法getdata?

mAllApi.getData(new Request().getRequestData())
           .flatMap(response -> {
               if (response.getError().equals(ECode.ERROR_TOKEN.getCode())) {
                     mAllApi.getRefreshToken(new String()).flatMap(new Function<AccessToken, ObservableSource<AccessToken>>() {
                        @Override
                        public ObservableSource<AccessToken> apply(AccessToken accessToken) throws Exception {
                           AccessTokenManager.saveNewAccessToken(accessToken);

                            return null;
                        }
                   });
               } else {
                   return Observable.just(response);
                }
           });

1 个答案:

答案 0 :(得分:0)

我们在应用程序中做了什么 - 我们创建了自定义OkHttp拦截器,每次我们执行验证请求时都会检查访问令牌,如果它被损坏的拦截器使用RefreshToken更改它,则向授权头添加新的更新值并重试请求。 以下是Kotlin的例子:

class RefreshAccessTokenInterceptor
@Inject constructor() : Interceptor {

    override fun intercept(chain: Interceptor.Chain): Response {
        val response = chain.proceed(retryRequest(chain))
        return if (response.noAuthError()) {
            response
        } else {
            updateIfNeededOrProcessWithNewToken(chain)
        }
    }

    private fun retryRequest(chain: Interceptor.Chain): Request {
        val builder = chain.request().newBuilder()
        addAuthHeaders(builder)
        return builder.build()
    }

    private fun Response.noAuthError() = code() != HttpErrorChecker.HTTP_AUTHENTICATION_TIMEOUT

    private fun addAuthHeaders(builder: Request.Builder) {
        val accessToken = getAccessToken()
        if (!accessToken.isNullOrEmpty()) {
            builder.header("Authorization", "Bearer $accessToken")
        }
    }

    private fun updateIfNeededOrProcessWithNewToken(chain: Interceptor.Chain): Response {
        //here you update your token, add new header and retries request

        return chain.proceed(retryRequest(chain))
    }
}
相关问题