【问题标题】:Managing Auth Token using RxJava使用 RxJava 管理 Auth Token
【发布时间】: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


【解决方案1】:

您可以在Observable 上使用.cache() 进行令牌刷新: http://reactivex.io/documentation/operators/replay.html

【讨论】:

  • 你会如何使用它?我对如何避免多次身份验证调用有点困惑。
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-27
相关资源
最近更新 更多