1

我已经实现了一个 micronautHttpClientFilter来为对 3rd 方服务的所有请求添加一个缓存的不记名令牌,但是这个令牌会定期过期。我想使用下游 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);
                });
    }
}

谁能提出正确的方法来做到这一点?

4

1 回答 1

0
  1. 您可以在 application.yml 中使用 advanced-expiration 属性。如果将其设置为 200 秒,则 micronaut 认为令牌在实际到期期限前 200 秒过期。https://micronaut-projects.github.io/micronaut-security/latest/guide/#io.micronaut.security.oauth2.configuration.OauthClientConfigurationProperties$ClientCredentialsConfigurationProperties
  2. 您可以使用 micronaut 在此平台第 18 页提供的重试注释https://objectcomputing.com/files/6315/7297/3014/Slide_Deck_Micronaut_Declarative_HTTP_Client_Webinar.pdf
于 2021-02-10T04:30:29.660 回答