我们在Android应用中使用Retrofit与OAuth2安全服务器进行通信.一切都很好,我们使用RequestInterceptor在每次调用时包含访问令牌.但是,有时候,访问令牌将过期,并且需要刷新令牌.当令牌过期时,下一个调用将返回一个未授权的HTTP代码,因此很容易监控.我们可以通过以下方式修改每个Retrofit调用:在失败回调中,检查错误代码,如果它等于Unauthorized,则刷新OAuth令牌,然后重复Retrofit调用.但是,为此,应修改所有呼叫,这不是一个易于维护的好解决方案.有没有办法在不修改所有Retrofit调用的情况下执行此操作?
我同时加载了一个ViewPager和三个webservice调用ViewPager.
当第一个返回401时,Authenticator调用并刷新内部令牌Authenticator,但剩余的2个请求已经发送到具有旧刷新令牌的服务器,并且失败,498在Interceptor中捕获并且应用程序被注销.
这不是我期望的理想行为.我想将第二个和第三个请求保留在队列中,当刷新令牌时,重试排队的请求.
目前,我有一个变量来指示令牌刷新是否正在进行中Authenticator,在这种情况下,我取消了所有后续请求Interceptor,用户必须手动刷新页面,否则我可以注销用户并强制用户登录.
使用okhttp 3.x for Android的上述问题有什么好的解决方案或架构?
编辑:我想解决的问题一般,我不想对我的电话进行排序.即等待一个调用完成并刷新令牌,然后仅在活动和片段级别上发送其余请求.
代码被要求.这是一个标准代码Authenticator:
public class CustomAuthenticator implements Authenticator {
@Inject AccountManager accountManager;
@Inject @AccountType String accountType;
@Inject @AuthTokenType String authTokenType;
@Inject
public ApiAuthenticator(@ForApplication Context context) {
}
@Override
public Request authenticate(Route route, Response response) throws IOException {
// Invaidate authToken
String accessToken = accountManager.peekAuthToken(account, authTokenType);
if (accessToken != null) {
accountManager.invalidateAuthToken(accountType, accessToken);
}
try {
// Get new refresh …Run Code Online (Sandbox Code Playgroud)