在应用程序中注册时,用户获得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);
}
});
答案 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))
}
}