使用RxJava管理身份验证令牌

时间:2015-08-25 06:14:10

标签: android access-token retrofit rx-java

我一直想知道解决令牌刷新问题的最佳方法是什么。 我正在连接到一个API,它为我提供了一个auth-token,如果在调用过程中的某个时间我得到一个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(),令牌刷新,我再次运行retrofit命令,所以最后Observable传回给订阅者。按预期工作。 我正在努力解决的问题是,我发出了多次调用,例如,我一个接一个地调用getUsers和getFlags。他们俩都得到了INVALID_AUTH,目前都是fire refreshToken(),这很糟糕。 我正在寻找一种rx-java方式来管理调用,这意味着在第一次调用getUsers后会激活refreshToken,之后的任何调用都需要等待refreshToken结束,然后才会触发改进命令。

任何建议都将受到赞赏。

0 个答案:

没有答案