我有一个带方法的TokenProvider:
sum()
OkHttp的Authenticator implmentation看起来像这样:
public Observable<Token> authWithRefreshToken() {
[...]
return makeOAuth2Call(source);
}
基本上,我的问题是:怎么做对了?我可以以某种方式同步接收令牌吗?当然我可以改变我的OAuth API,但我只是好奇。
答案 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;
我在项目中做了类似的事情。
答案 2 :(得分:0)
我建议您在Rx层上执行此操作,而不是在OkHttp层中执行此操作;这将阻止更少的线程并允许f.e.重试令牌检索失败。