RestTemplate avec authentification Digest
1. Vue d'ensemble
Cet article montrera commentconfigure the Spring RestTemplate to consume a service secured with Digest Authentication.
Semblable à l'authentification de base, une fois l'authentification Digest définie dans le modèle, le client pourra suivre les étapes de sécurité nécessaires et obtenir les informations nécessaires pour l'en-têteAuthorization:
Authorization: Digest
username="user1",
realm="Custom Realm Name",
nonce="MTM3NTYwOTA5NjU3OTo5YmIyMjgwNTFlMjdhMTA1MWM3OTMyMWYyNDY2MGFlZA==",
uri="/spring-security-rest-digest-auth/api/foos/1",
....
Avec ces données, le serveur peut authentifier correctement la demande et renvoyer la réponse 200 OK.
2. Configurer lesRestTemplate
LeRestTemplate doit être déclaré commea bean in the Spring context - c'est assez simple en XML ou en Java simple, en utilisant l'annotation@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;
}
}
La plupart de la configuration du mécanisme d'accès au condensé se fait dans l'implémentation personnalisée de la fabrique de requêtes http client injectée dans le modèle -HttpComponentsClientHttpRequestFactoryDigestAuth.
Notez que nous préconfigurons maintenant le modèle avec les informations d'identification qui ont accès à l'API sécurisée.
3. Configurer l'authentification Digest
Nous allons exploiter le support introduit dans Spring 3.1 pour le HttpClient 4.x actuel - à savoir leHttpComponentsClientHttpRequestFactory - en l'étendant et en le configurant.
Nous allons principalement configurer lesHttpContext et connecter notre logique personnalisée pour l'authentification 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;
}
}
Maintenant, lesRestTemplate peuvent simplement être injectés et utilisés dans un test:
@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());
}
Pour illustrer le processus de configuration complet, ce test configure également les informations d'identification de l'utilisateur -user1 etuser1Pass. Cette partie doit, bien entendu, être effectuéeonly once and outside the test itself.
4. Dépendances Maven
Les dépendances Maven requises pour lesRestTemplate et la bibliothèque HttpClient sont:
org.springframework
spring-webmvc
4.1.1.RELEASE
org.apache.httpcomponents
httpclient
4.3.5
5. Conclusion
Ce tutoriel a montré comment configurer etconfigure the Rest Template so that it can consume an application secured with Digest authentication. L'API REST elle-même doit être le mécanismeconfigured with the digest security.
L'implémentation peut être trouvée dansthe example GitHub project - il s'agit d'un projet basé sur Maven, il devrait donc être facile à importer et à exécuter tel quel.