Я реализовал микронавт HttpClientFilter
, чтобы добавить кэшированный токен-носитель для всех запросов к сторонней службе, однако срок действия этого токена истекает довольно регулярно. Я хотел бы повторно подтвердить подлинность с помощью нижестоящего API и повторить запрос, когда это произойдет, но, похоже, не существует очевидного способа сделать это. Пока я просто вызываю proceed
во второй раз, однако это вызывает ошибку Index out of bounds
(я думаю , что это является исключением, которое предполагается, что будет выброшено, но здесь есть ошибка в Micronaut). Минимальное сокращение того, что у меня есть, ниже:
import io.micronaut.http.HttpResponse;
import io.micronaut.http.HttpStatus;
import io.micronaut.http.MutableHttpRequest;
import io.micronaut.http.annotation.Filter;
import io.micronaut.http.client.exceptions.HttpClientResponseException;
import io.micronaut.http.filter.ClientFilterChain;
import io.micronaut.http.filter.HttpClientFilter;
import io.reactivex.Flowable;
import javax.inject.Inject;
interface AuthTokenProvider {
// cached
Flowable<String> fetchToken();
void invalidateToken();
}
@Filter(serviceId = "third-party-api")
public class AuthTokenFilter implements HttpClientFilter {
@Inject AuthTokenProvider tokenProvider;
private Flowable<HttpResponse<?>> buildRequestWithToken(MutableHttpRequest<?> request, ClientFilterChain chain) {
return tokenProvider.fetchToken()
.map(token -> request.bearerAuth(token))
.flatMap(chain::proceed);
}
@Override
public Flowable<HttpResponse<?>> doFilter(MutableHttpRequest<?> request, ClientFilterChain chain) {
return buildRequestWithToken(request, chain)
.onErrorResumeNext(err -> {
System.out.println("API request failed, invalidating token and retrying");
tokenProvider.invalidateToken();
return buildRequestWithToken(request, chain);
});
}
}
Может кто-нибудь предложить правильный способ сделать это?