Рэсурс WebClient, які ідзе праз проксі, можа ўсё яшчэ пацярпець няўдачу да выкліку API, калі атрыманне токена выкарыстоўвае іншы канэктэр. Для рэактыўнага патоку client_credentials у Spring Security 6.5 злучыце ўсе тры часткі:

HttpClient route = HttpClient.create()
    .proxy(p -> p.type(ProxyProvider.Proxy.HTTP)
        .host("proxy.example").port(8080));
WebClient tokenHttp = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(route))
    .build();

var tokens = new WebClientReactiveClientCredentialsTokenResponseClient();
tokens.setWebClient(tokenHttp);

var provider = new ClientCredentialsReactiveOAuth2AuthorizedClientProvider();
provider.setAccessTokenResponseClient(tokens);

var manager = new AuthorizedClientServiceReactiveOAuth2AuthorizedClientManager(
    registrations, authorizedClients);
manager.setAuthorizedClientProvider(provider);

tokens.setWebClient прызначае HTTP-кліент токена; provider.setAccessTokenResponseClient прызначае яго правайдэру гранта; manager.setAuthorizedClientProvider усталёўвае гэты правайдэр. Выкарыстоўвайце гэты мэнэджар у рэальным фільтры OAuth або ў працэсе authorized-client.

HttpClient і ProxyProvider — тыпы Reactor Netty. WebClient і яго канэктэр — тыпы Spring WebFlux. Падайце існуючы ReactiveClientRegistrationRepository як registrations, а ReactiveOAuth2AuthorizedClientService як authorizedClients.

Гэты правайдэр апрацоўвае client_credentials; захавайце адпаведны ланцуг правайдэраў, калі патрэбны іншыя гранты. У прыкладзе няма ўліковага запісу проксі — ён належаў бы да транспарту, а не да OAuth client ID/secret. Для публічнай канцавой кропкі токена, дазволенай праз публічны пасярэднік, выбірайце хост і порт з спіса HTTP-проксі.

Наладзьце таксама канэктэр абароненага рэсурсу, калі гэтым выклікам API патрэбны маршрут. Поспех токена і поспех API — асобныя вынікі.

Падобныя артыкулы