带有RxJava的OkHttp3身份验证器

时间:2017-01-06 23:38:35

标签: java android rx-java okhttp

我有一个带方法的TokenProvider:

sum()

OkHttp的Authenticator implmentation看起来像这样:

public Observable<Token> authWithRefreshToken() {
    [...]
    return makeOAuth2Call(source);
}

基本上,我的问题是:怎么做对了?我可以以某种方式同步接收令牌吗?当然我可以改变我的OAuth API,但我只是好奇。

3 个答案:

答案 0 :(得分:1)

所以经过一段时间的搜索我发现了这个:

@Override
public Request authenticate(Route route, Response response) throws IOException {

    Token tokenObservable = tokenProvider.authWithRefreshToken().toBlocking().first();

    return response.request().newBuilder()
            .header("Authorization", "Bearer " + tokenObservable.getRefresh_token())
            .build();
}

正如toBlocking的文档所说:

  

将Observable转换为BlockingObservable(带有阻塞运算符的Observable)。

答案 1 :(得分:0)

由于您已有原始请求的拦截器,您可以检查该拦截器​​中的响应并进行同步阻塞调用以刷新令牌。

然后您可以重试原始请求。

在Authenticator或Interceptor中进行阻塞调用并不是一个好主意,但通常可能会起作用。像

这样的东西
Response result = chain.proceed(requestWithOldToken);

if (result.code() == 401) {
  String newToken = refreshToken();
  Request requestWithNewToken = ...; 
  result = chain.proceed(requestWithOldToken);
}

return result;

我在项目中做了类似的事情。

https://github.com/yschimke/oksocial/blob/2cdc38f1f6de255846a78b7c9f6747314b733a79/src/main/java/com/baulsupp/oksocial/authenticator/ServiceInterceptor.java#L49

答案 2 :(得分:0)

我建议您在Rx层上执行此操作,而不是在OkHttp层中执行此操作;这将阻止更少的线程并允许f.e.重试令牌检索失败。