Autenticação básica com o RestTemplate
Índice
1. Visão geral
Este artigo mostra como usar as molasRestTemplate aconsume a RESTful Service secured with Basic Authentication.
Assim que a autenticação básica for configurada para o modelo, cada solicitação será enviadapreemptively containing the full credentials necessária para realizar o processo de autenticação. As credenciais serão codificadas e usarão o cabeçalho HTTPAuthorization, de acordo com as especificações do esquema de autenticação básica. Um exemplo seria assim:
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Leitura adicional:
Tratamento de erros RestTemplate de primavera
Aprenda a lidar com erros com RestTemplate de Spring
Usando o Spring RestTemplate Interceptor
Aprenda sobre o uso de interceptores em seu aplicativo Spring com o RestTemplate.
Explorando o Spring Boot TestRestTemplate
Aprenda a usar o novo TestRestTemplate no Spring Boot para testar uma API simples.
2. Configurando oRestTemplate
A inicialização deRestTemplate no contexto do Spring pode ser feita simplesmente declarando um bean para ele; entretanto, configurarRestTemplate comBasic Authentication exigirá intervenção manual, portanto, em vez de declarar o bean diretamente, um SpringFactoryBean será usado para maior flexibilidade. Esta fábrica criará e configurará o modelo na inicialização:
@Component
public class RestTemplateFactory
implements FactoryBean, InitializingBean {
private RestTemplate restTemplate;
public RestTemplate getObject() {
return restTemplate;
}
public Class getObjectType() {
return RestTemplate.class;
}
public boolean isSingleton() {
return true;
}
public void afterPropertiesSet() {
HttpHost host = new HttpHost("localhost", 8082, "http");
restTemplate = new RestTemplate(
new HttpComponentsClientHttpRequestFactoryBasicAuth(host));
}
}
Os valoreshosteport devem ser dependentes do ambiente - permitindo ao cliente a flexibilidade de definir um conjunto de valores para teste de integração e outro para uso em produção. Os valores podem ser gerenciados porfirst class Spring support for properties files.
3. Gerenciamento manual do cabeçalho HTTP de autorização
O processo de criação do cabeçalhoAuthorization é relativamente direto para a autenticação básica, portanto, pode ser feito manualmente com algumas linhas de código:
HttpHeaders createHeaders(String username, String password){
return new HttpHeaders() {{
String auth = username + ":" + password;
byte[] encodedAuth = Base64.encodeBase64(
auth.getBytes(Charset.forName("US-ASCII")) );
String authHeader = "Basic " + new String( encodedAuth );
set( "Authorization", authHeader );
}};
}
Em seguida, o envio de uma solicitação se torna igualmente simples:
restTemplate.exchange
(uri, HttpMethod.POST, new HttpEntity(createHeaders(username, password)), clazz);
4. Gerenciamento automático do cabeçalho HTTP de autorização
O Spring 3.0 e 3.1 e agora 4.x têm um suporte muito bom para as bibliotecas HTTP Apache:
-
Spring 3.0, oCommonsClientHttpRequestFactory integrado com o agoraend-of-life’dHttpClient 3.x
-
O Spring 3.1 introduziu suporte para oHttpClient 4.x atual viaHttpComponentsClientHttpRequestFactory (suporte adicionado no JIRASPR-6180)
-
Spring 4.0 introduziu suporte assíncrono por meio doHttpComponentsAsyncClientHttpRequestFactory
Vamos começar a configurar o HttpClient 4 e o Spring 4.
ORestTemplate exigirá uma fábrica de solicitação HTTP - uma fábrica que oferece suporte à autenticação básica - até agora, tudo bem. No entanto, usar oHttpComponentsClientHttpRequestFactory existente diretamente provará ser difícil, já que a arquitetura deRestTemplate foi projetadawithout good support paraHttpContext - uma peça instrumental do quebra-cabeça. E então precisaremos criar a subclasseHttpComponentsClientHttpRequestFactorye substituir o métodocreateHttpContext:
public class HttpComponentsClientHttpRequestFactoryBasicAuth
extends HttpComponentsClientHttpRequestFactory {
HttpHost host;
public HttpComponentsClientHttpRequestFactoryBasicAuth(HttpHost host) {
super();
this.host = host;
}
protected HttpContext createHttpContext(HttpMethod httpMethod, URI uri) {
return createHttpContext();
}
private HttpContext createHttpContext() {
AuthCache authCache = new BasicAuthCache();
BasicScheme basicAuth = new BasicScheme();
authCache.put(host, basicAuth);
BasicHttpContext localcontext = new BasicHttpContext();
localcontext.setAttribute(HttpClientContext.AUTH_CACHE, authCache);
return localcontext;
}
}
É aqui - na criação doHttpContext - que o suporte básico de autenticação é integrado. Como você pode ver, fazer autenticação básica preemptiva com HttpClient 4.x éa bit of a burden: as informações de autenticação são armazenadas em cache e o processo de configuração desse cache de autenticação é muito manual e não intuitivo.
E com isso, tudo está no lugar - oRestTemplate agora será capaz de suportar o esquema de autenticação básica apenas adicionando umBasicAuthorizationInterceptor;
restTemplate.getInterceptors().add(
new BasicAuthorizationInterceptor("username", "password"));
E o pedido:
restTemplate.exchange(
"http://localhost:8082/spring-security-rest-basic-auth/api/foos/1",
HttpMethod.GET, null, Foo.class);
Para uma discussão aprofundada sobre como proteger o próprio Serviço REST,check out this article.
5. Dependências do Maven
As seguintes dependências do Maven são necessárias para o próprioRestTemplate e para a biblioteca HttpClient:
org.springframework
spring-webmvc
5.0.6.RELEASE
org.apache.httpcomponents
httpclient
4.5.3
Opcionalmente, se o cabeçalho HTTPAuthorization for construído manualmente, uma biblioteca adicional será necessária para o suporte de codificação:
commons-codec
commons-codec
1.10
Você encontrará as versões mais recentes emMaven repository.
6. Conclusão
Embora o ramo 3.x de desenvolvimento para Apache HttpClient tenha chegado ao fim da vida por um tempo e o suporte Spring para essa versão tenha sido totalmente obsoleto, muitas das informações que podem ser encontradas emRestTemplatee segurança ainda não conta para lançamentos dethe current HttpClient 4.x. Este artigo é uma tentativa de mudar isso por meio de uma discussão detalhada e passo a passo sobre como configurar a autenticação básica comRestTemplatee usá-la para consumir uma API REST segura.
Para ir além dos exemplos de código no artigo com uma implementação do lado de consumo, examinado aqui, mas também do serviço RESTful real, dê uma olhada no projetoover on Github.
Este é um projeto baseado em Maven, portanto, deve ser fácil importar e executar como está.