RestTemplate com autenticação Digest
1. Visão geral
Este artigo mostrará comoconfigure the Spring RestTemplate to consume a service secured with Digest Authentication.
Semelhante à autenticação básica, uma vez que a autenticação Digest é definida no modelo, o cliente poderá seguir as etapas de segurança necessárias e obter as informações necessárias para o cabeçalhoAuthorization:
Authorization: Digest
username="user1",
realm="Custom Realm Name",
nonce="MTM3NTYwOTA5NjU3OTo5YmIyMjgwNTFlMjdhMTA1MWM3OTMyMWYyNDY2MGFlZA==",
uri="/spring-security-rest-digest-auth/api/foos/1",
....
Com esses dados, o servidor pode autenticar corretamente a solicitação e retornar a resposta 200 OK.
2. Configure oRestTemplate
ORestTemplate precisa ser declarado comoa bean in the Spring context - isso é simples o suficiente em XML ou Java puro, usando a anotação@Bean:
import org.apache.http.HttpHost;
import org.example.client.HttpComponentsClientHttpRequestFactoryDigestAuth;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ClientConfig {
@Bean
public RestTemplate restTemplate() {
HttpHost host = new HttpHost("localhost", 8080, "http");
CloseableHttpClient client = HttpClientBuilder.create().
setDefaultCredentialsProvider(provider()).useSystemProperties().build();
HttpComponentsClientHttpRequestFactory requestFactory =
new HttpComponentsClientHttpRequestFactoryDigestAuth(host, client);
return new RestTemplate(requestFactory);;
}
private CredentialsProvider provider() {
CredentialsProvider provider = new BasicCredentialsProvider();
UsernamePasswordCredentials credentials =
new UsernamePasswordCredentials("user1", "user1Pass";
provider.setCredentials(AuthScope.ANY, credentials);
return provider;
}
}
A maior parte da configuração do mecanismo de acesso digest é feita na implementação customizada da fábrica de solicitação http do cliente injetada no modelo -HttpComponentsClientHttpRequestFactoryDigestAuth.
Observe que agora estamos pré-configurando o modelo com as credenciais que têm acesso à API segura.
3. Configurar Autenticação Digest
Vamos alavancar o suporte introduzido no Spring 3.1 para o HttpClient 4.x atual - ou seja, oHttpComponentsClientHttpRequestFactory - estendendo-o e configurando-o.
Iremos principalmente configurar oHttpContext e conectar nossa lógica personalizada para autenticação Digest:
import java.net.URI;
import org.apache.http.HttpHost;
import org.apache.http.client.AuthCache;
import org.apache.http.client.protocol.ClientContext;
import org.apache.http.impl.auth.DigestScheme;
import org.apache.http.impl.client.BasicAuthCache;
import org.apache.http.protocol.BasicHttpContext;
import org.apache.http.protocol.HttpContext;
import org.springframework.http.HttpMethod;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
public class HttpComponentsClientHttpRequestFactoryDigestAuth
extends HttpComponentsClientHttpRequestFactory {
HttpHost host;
public HttpComponentsClientHttpRequestFactoryDigestAuth(HttpHost host) {
super(httpClient);
this.host = host;
}
@Override
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
return createHttpContext();
}
private HttpContext createHttpContext() {
// Create AuthCache instance
AuthCache authCache = new BasicAuthCache();
// Generate DIGEST scheme object, initialize it and add it to the local auth cache
DigestScheme digestAuth = new DigestScheme();
// If we already know the realm name
digestAuth.overrideParamter("realm", "Custom Realm Name");
authCache.put(host, digestAuth);
// Add AuthCache to the execution context
BasicHttpContext localcontext = new BasicHttpContext();
localcontext.setAttribute(ClientContext.AUTH_CACHE, authCache);
return localcontext;
}
}
Agora, oRestTemplate pode simplesmente ser injetado e usado em um teste:
@Test
public void whenSecuredRestApiIsConsumed_then200OK() {
String uri = "http://localhost:8080/spring-security-rest-digest-auth/api/foos/1";
ResponseEntity entity = restTemplate.exchange(uri, HttpMethod.GET, null, Foo.class);
System.out.println(entity.getStatusCode());
}
Para ilustrar o processo de configuração completo, este teste também define as credenciais do usuário -user1euser1Pass. Esta parte deve, é claro, ser feitaonly once and outside the test itself.
4. Dependências do Maven
As dependências Maven necessárias paraRestTemplatee a biblioteca HttpClient são:
org.springframework
spring-webmvc
4.1.1.RELEASE
org.apache.httpcomponents
httpclient
4.3.5
5. Conclusão
Este tutorial mostrou como configurar econfigure the Rest Template so that it can consume an application secured with Digest authentication. A própria API REST precisa ser o mecanismoconfigured with the digest security.
A implementação pode ser encontrada emthe example GitHub project - este é um projeto baseado em Maven, portanto, deve ser fácil de importar e executar como está.