O navegador chega ao provedor de identidade e depois o login falha quando a aplicação troca o código de autorização devolvido. Essa troca é um pedido de saída do servidor da aplicação, com o seu próprio cliente HTTP.

Para a API baseada em RestClient disponível no Spring Security 6.5, forneça uma fábrica de pedidos ciente do proxy ao cliente de resposta do token do código de autorização:

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);

As classes de conversor e de manipulador de erros preservam o comportamento documentado do pedido de token do Spring Security. Um RestClient genérico configurado apenas para uma API JSON não relacionada não é uma substituição equivalente.

Ligue o mesmo tokenClient à configuração de segurança existente:

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

Estes são fragmentos de configuração para uma aplicação que já tem o registo de cliente e o SecurityFilterChain. Selecionam um proxy HTTP sem autenticação; um proxy que exige credenciais precisa da configuração de autenticação correspondente do transporte escolhido. Para um endpoint de token HTTPS acessível publicamente numa rota pública permitida, uma entrada HTTP da lista de proxies HTTP pode preencher esse endereço de proxy sem conta.

Mantenha o host do proxy separado da porta e do esquema de URL. Deixe o URI do token do provedor de identidade como destino. O exemplo não substitui a validação de certificados.

Os pedidos posteriores precisam da sua própria verificação de propriedade. A obtenção de UserInfo, as trocas de token de atualização, as concessões client-credentials e as chamadas a API protegidas podem usar outros objetos de cliente. Configure o cliente suportado correspondente quando essa operação também precisar da rota. Para o fluxo reativo client_credentials do Spring Security 6.5, configure o cliente de token reativo e o seu provedor de concessões separadamente.

Os exemplos antigos que usam OAuth2RestTemplate e AccessTokenProvider pertencem ao projeto Spring Security OAuth mais antigo. Escolha a API usada pela aplicação instalada antes de adaptar o código; não misture esses objetos nesta configuração.

Artigos relacionados