【发布时间】:2015-11-18 17:29:21
【问题描述】:
我一直想知道解决令牌刷新问题的最佳方法是什么。 我正在连接一个为我提供身份验证令牌的 API,如果在调用期间的某个时间我得到一个 INVALID_AUTH,我需要重新进行身份验证。 所以对于天真的实现,我这样做了
@SuppressWarnings("unchecked")
@Override
public Observable<User> getUsers() {
return runCommandAndrefreshAuthIfNecessary(new RequestCommand() {
@Override
public Observable create() {
return createService(UsersApi.class).getUsers();
}
});
}
private Observable runCommandAndrefreshAuthIfNecessary(final RequestCommand command) {
return command.create()
.onErrorResumeNext(new Func1<Throwable, Observable<?>>() {
@Override
public Observable<?> call(Throwable throwable) {
return handleRefreshToken(command);
}
});
}
private Observable<?> handleRefreshToken(final RequestCommand command) {
return refreshToken().flatMap(new Func1<Boolean, Observable<?>>() {
@Override
public Observable<?> call(Boolean aBoolean) {
return command.create();
}
});
}
正如你所看到的,我只是包装了改造命令,如果我得到一个错误我运行 refreshToken(),令牌刷新,我再次运行改造命令,所以最后 Observable 被传回给订阅者。按预期工作。 我正在苦苦挣扎的事情是,在进行多次调用时会发生什么,例如,我一个接一个地调用 getUsers 和 getFlags 。他们都得到了 INVALID_AUTH,目前两者都触发了 refreshToken(),这很糟糕。 我正在寻找一种 rx-java 方法来管理调用,这意味着在 getUsers 的第一次调用触发 refreshToken 之后,之后的任何调用都需要等待 refreshToken 结束,然后才触发改造命令。
任何建议将不胜感激。
【问题讨论】:
-
您找到其他解决方案了吗? @alexk
标签: android access-token retrofit rx-java