gpt4 book ai didi

java - 刷新 token rxjava+retrofir2

转载 作者:太空宇宙 更新时间:2023-11-04 10:31:36 24 4
gpt4 key购买 nike

在应用程序中注册时,用户将获得 2 个 token 。访问(有效期 1 天)和刷新(有效期 6 个月)。在某一时刻,访问 token 将会到来——有一天会出现自定义错误。此时,我们需要调用refreshToken方法和updated方法,工作将继续进行。我们调用该方法,例如 getdata ,检查错误,如果自定义错误,我们将使用更新的 token 保留两个 token getdata 。

我尝试了,但是如何在刷新 token 后重新调用 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);
}
});

最佳答案

我们在应用程序中做了什么 - 我们创建了自定义 OkHttp 拦截器,每次执行身份验证请求时都会检查访问 token ,如果拦截器损坏,则使用 RefreshToken 进行更改,将新的更新值添加到授权 header 并重试请求。这是 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))
}
}

关于java - 刷新 token rxjava+retrofir2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49935435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com