Spring Reactive OAuth2: richieste di token client_credentials con proxy
Con client_credentials in Spring Security 6.5, collega il WebClient del token tramite il provider al gestore authorized-client realmente usato.
Una risorsa WebClient che passa da un proxy può comunque fallire prima della chiamata API se l'ottenimento del token usa un altro connector. Per il flusso reattivo client_credentials di Spring Security 6.5 collega tutte e tre le parti:
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 assegna il client HTTP del token; provider.setAccessTokenResponseClient lo assegna al provider del grant; manager.setAuthorizedClientProvider installa quel provider. Usa questo gestore nel filtro OAuth reale o nel flusso di lavoro authorized-client.
HttpClient e ProxyProvider sono tipi Reactor Netty. WebClient e il suo connector sono tipi Spring WebFlux. Passa il ReactiveClientRegistrationRepository esistente come registrations e il ReactiveOAuth2AuthorizedClientService come authorizedClients.
Questo provider gestisce client_credentials; conserva una catena di provider adeguata se servono altri grant. L'esempio non ha un account proxy: apparterrebbe al trasporto, non all'ID/secret del client OAuth. Per un endpoint token pubblico consentito tramite un intermediario pubblico, scegli host e porta dalla lista di proxy HTTP.
Configura anche il connector della risorsa protetta quando quelle chiamate API hanno bisogno della rotta. Il successo del token e quello dell'API sono esiti separati.