Le navigateur atteint le fournisseur d'identité, puis la connexion échoue lorsque l'application échange le code d'autorisation renvoyé. Cet échange est une requête sortante du serveur d'application, avec son propre client HTTP.

Pour l'API basée sur RestClient disponible dans Spring Security 6.5, fournissez une fabrique de requêtes compatible proxy au client de réponse de jeton du code d'autorisation :

SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
factory.setProxy(new java.net.Proxy(
    java.net.Proxy.Type.HTTP,
    new java.net.InetSocketAddress("proxy.example", 8080)));
factory.setConnectTimeout(5000);
factory.setReadTimeout(15000);

RestClient tokenHttp = RestClient.builder()
    .requestFactory(factory)
    .messageConverters(converters -> {
        converters.clear();
        converters.add(new FormHttpMessageConverter());
        converters.add(new OAuth2AccessTokenResponseHttpMessageConverter());
    })
    .defaultStatusHandler(new OAuth2ErrorResponseErrorHandler())
    .build();

RestClientAuthorizationCodeTokenResponseClient tokenClient =
    new RestClientAuthorizationCodeTokenResponseClient();
tokenClient.setRestClient(tokenHttp);

Les classes de convertisseur et de gestionnaire d'erreurs préservent le comportement documenté des requêtes de jeton de Spring Security. Un RestClient générique configuré uniquement pour une API JSON sans rapport n'est pas un remplacement équivalent.

Branchez ce même tokenClient dans la configuration de sécurité existante :

http.oauth2Login(login -> login
    .tokenEndpoint(token -> token
        .accessTokenResponseClient(tokenClient)));

Ce sont des fragments de configuration pour une application qui possède déjà son enregistrement de client et son SecurityFilterChain. Ils sélectionnent un proxy HTTP sans authentification ; un proxy exigeant des identifiants nécessite la configuration d'authentification correspondante du transport choisi. Pour un point de terminaison de jeton HTTPS accessible publiquement sur une route publique autorisée, une entrée HTTP de la liste de proxys HTTP peut renseigner cette adresse de proxy sans compte.

Gardez l'hôte du proxy distinct de son port et de son schéma d'URL. Laissez l'URI de jeton du fournisseur d'identité comme destination. L'exemple ne remplace pas la validation des certificats.

Les requêtes ultérieures ont besoin de leur propre contrôle de propriété. La récupération d'UserInfo, les échanges de jeton de rafraîchissement, les attributions client-credentials et les appels d'API protégés peuvent utiliser d'autres objets client. Configurez le client pris en charge correspondant lorsque cette opération a aussi besoin de la route. Pour le flux réactif client_credentials de Spring Security 6.5, configurez le client de jeton réactif et son fournisseur d'attribution séparément.

Les exemples hérités utilisant OAuth2RestTemplate et AccessTokenProvider appartiennent à l'ancien projet Spring Security OAuth. Choisissez l'API utilisée par l'application installée avant d'adapter le code ; ne mélangez pas ces objets dans cette configuration.

Articles similaires