Autenticación básica con RestTemplate

Tabla de contenido

  • 1. Resumen
  • 2. Configuración de RestTemplate en Spring
  • 3. Gestión manual del encabezado HTTP de autorización
  • 4. Gestión automática del encabezado HTTP de autorización
  • 5. Dependencias de Maven
  • 6. Conclusión

1. Información general

Este artículo muestra cómo usar Springs RestTemplate para consumir un servicio RESTful protegido con autenticación básica .

Una vez que se configura la autenticación básica para la plantilla, cada solicitud se enviará de forma preventiva con las credenciales completas necesarias para realizar el proceso de autenticación. Las credenciales se codificarán y utilizarán el encabezado HTTP de autorización , de acuerdo con las especificaciones del esquema de autenticación básica. Un ejemplo se vería así:

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

2. Configuración de RestTemplate

Se puede arrancar RestTemplate en el contexto Spring simplemente declarando un bean para él; sin embargo, configurar RestTemplate con autenticación básica requerirá intervención manual, por lo que en lugar de declarar el bean directamente, se usará un Spring FactoryBean para mayor flexibilidad. Esta fábrica creará y configurará la plantilla en la inicialización:

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

Los valores de puerto y host deben depender del entorno, lo que permite al cliente la flexibilidad de definir un conjunto de valores para las pruebas de integración y otro para el uso de producción. Los valores pueden ser administrados por el soporte Spring de primera clase para archivos de propiedades.

3. Gestión manual del encabezado HTTP de autorización

El proceso de creación del encabezado de autorización es relativamente sencillo para la autenticación básica, por lo que prácticamente se puede hacer manualmente con unas pocas líneas 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 ); }}; }

Entonces, enviar una solicitud se vuelve tan simple:

restTemplate.exchange (uri, HttpMethod.POST, new HttpEntity(createHeaders(username, password)), clazz);

4. Gestión automática del encabezado HTTP de autorización

Tanto Spring 3.0 como 3.1 y ahora 4.x tienen muy buen soporte para las bibliotecas HTTP de Apache:

  • Spring 3.0, CommonsClientHttpRequestFactory integrado con HttpClient 3.x, ahora al final de su vida útil
  • Spring 3.1 introdujo soporte para el HttpClient 4.x actual a través de HttpComponentsClientHttpRequestFactory (soporte agregado en JIRA SPR-6180)
  • Spring 4.0 introdujo el soporte asíncrono a través de HttpComponentsAsyncClientHttpRequestFactory

Comencemos a configurar las cosas con HttpClient 4 y Spring 4.

El RestTemplate requerirá una fábrica de petición HTTP - una fábrica que soporta la autenticación Básica - hasta ahora, todo bien. Sin embargo, usar el HttpComponentsClientHttpRequestFactory existente directamente resultará difícil, ya que la arquitectura de RestTemplate se diseñó sin un buen soporte para HttpContext , una pieza fundamental del rompecabezas. Y entonces necesitaremos subclase HttpComponentsClientHttpRequestFactory y anular el método createHttpContext :

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

Es aquí, en la creación de HttpContext , donde se integra el soporte de autenticación básica. Como puede ver, realizar la autenticación básica preventiva con HttpClient 4.x es un poco pesado: la información de autenticación se almacena en caché y el proceso de La configuración de esta caché de autenticación es muy manual y poco intuitiva.

Y con eso, todo está en su lugar: RestTemplate ahora podrá admitir el esquema de autenticación básica con solo agregar un BasicAuthorizationInterceptor ;

restTemplate.getInterceptors().add( new BasicAuthorizationInterceptor("username", "password"));

Y la solicitud:

restTemplate.exchange( "//localhost:8082/spring-security-rest-basic-auth/api/foos/1", HttpMethod.GET, null, Foo.class);

Para una discusión en profundidad sobre cómo asegurar el servicio REST en sí, consulte este artículo.

5. Dependencias de Maven

Las siguientes dependencias de Maven son necesarias para RestTemplate y para la biblioteca HttpClient:

 org.springframework spring-webmvc 5.0.6.RELEASE   org.apache.httpcomponents httpclient 4.5.3 

Opcionalmente, si el encabezado de autorización HTTP se construye manualmente, se requiere una biblioteca adicional para el soporte de codificación:

 commons-codec commons-codec 1.10 

Encontrarás las versiones más recientes en el repositorio de Maven.

6. Conclusión

Aunque la rama de desarrollo 3.x para Apache HttpClient ha llegado al final de su vida útil por un tiempo, y el soporte de Spring para esa versión ha quedado totalmente obsoleto, gran parte de la información que se puede encontrar en RestTemplate y la seguridad aún no lo hace. tenga en cuenta las versiones actuales de HttpClient 4.x. Este artículo es un intento de cambiar eso a través de una discusión detallada, paso a paso, sobre cómo configurar la autenticación básica con RestTemplate y cómo usarla para consumir una API REST segura.

Para ir más allá de los ejemplos de código en el artículo con la implementación tanto del lado consumidor, examinado aquí, como del Servicio RESTful real, eche un vistazo al proyecto en Github.

Este es un proyecto basado en Maven, por lo que debería ser fácil de importar y ejecutar como está.