RestTemplate с дайджест-аутентификацией

RestTemplate с дайджест-аутентификацией

1. обзор

Эта статья покажет, какconfigure the Spring RestTemplate to consume a service secured with Digest Authentication.

Подобно базовой аутентификации, как только дайджест-аутентификация будет установлена ​​в шаблоне, клиент сможет пройти необходимые шаги безопасности и получить информацию, необходимую для заголовкаAuthorization:

Authorization: Digest
    username="user1",
    realm="Custom Realm Name",
    nonce="MTM3NTYwOTA5NjU3OTo5YmIyMjgwNTFlMjdhMTA1MWM3OTMyMWYyNDY2MGFlZA==",
    uri="/spring-security-rest-digest-auth/api/foos/1",
    ....

С этими данными сервер может правильно аутентифицировать запрос и вернуть ответ 200 OK.

2. НастройтеRestTemplate

RestTemplate необходимо объявить какa bean in the Spring context - это достаточно просто либо в XML, либо на простой Java, используя аннотацию@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;
    }
}

Большая часть настройки механизма доступа к дайджесту выполняется в пользовательской реализации фабрики HTTP-запросов клиента, внедренной в шаблон -HttpComponentsClientHttpRequestFactoryDigestAuth.

Обратите внимание, что сейчас мы предварительно настраиваем шаблон с учетными данными, которые имеют доступ к защищенному API.

3. Настроить дайджест-аутентификацию

Мы собираемся использовать поддержку, представленную в Spring 3.1 для текущего HttpClient 4.x, а именноHttpComponentsClientHttpRequestFactory, путем ее расширения и настройки.

В основном мы собираемся настроитьHttpContext и подключить нашу собственную логику для дайджест-аутентификации:

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

ТеперьRestTemplate можно просто ввести и использовать в тесте:

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

Чтобы проиллюстрировать полный процесс настройки, этот тест также устанавливает учетные данные пользователя -user1 иuser1Pass. Эта часть, конечно, должна быть выполненаonly once and outside the test itself.

4. Maven Зависимости

Необходимые зависимости Maven дляRestTemplate и библиотеки HttpClient:


   org.springframework
   spring-webmvc
   4.1.1.RELEASE



   org.apache.httpcomponents
   httpclient
   4.3.5

5. Заключение

В этом руководстве показано, как настроить иconfigure the Rest Template so that it can consume an application secured with Digest authentication. Сам REST API должен быть механизмомconfigured with the digest security.

Реализацию можно найти вthe example GitHub project - это проект на основе Maven, поэтому его должно быть легко импортировать и запускать как есть.

Related