Как установить заголовок в запросе Spring RestTemplate

Задача
Установить в отправляемые через Spring RestTemplate запросы заголовок BASIC авторизации

Решение
Для подтверждения прав доступа на удаленном сервере посредством BASIC авторизации необходимо добавить в отправляемый запрос дополнительный HTTP заголовок Authorization.

Значение передаваемое в этом заголовке для BASIC авторизации формируется следующим образом:
1. Логин и пароль пользователя соединяются в одну строку разделенную двоеточним "login:password"
2. Полученная строка кодируется в кодировке Base64
3. Перед закодированной строкой через пробел добавляем имя способа авторизации Basic

Например, имеем пользователя с логином admin и паролем test, тогда в соответствии с указанными выше этапами получаем следующее:
1. Формируем строку логина и пароля "admin:test"

2. Кодируем строку в кодировке Base64, например, с помощью библиотеки Apache Commons Codec:
String token = Base64.encodeBase64String("admin:test".getBytes());

Получаем значение "YWRtaW46dGVzdA=="

3. К полученной закодированной строке добавляем тип авторизации Basic:
"Basic YWRtaW46dGVzdA=="

Далее необходимо при отправленни запросов через Spring RestTemplate во все запросы добавлять полученный заголовок. Для этого необходимо реализовать класс перехватчик запросов (интерфейс org.springframework.http.client.ClientHttpRequestInterceptor):
public class AuthHeaderInterceptor implements ClientHttpRequestInterceptor {
  
    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] data,
                 ClientHttpRequestExecution execution) throws IOException {

        request.getHeaders().add("Authorization", "Basic YWRtaW46dGVzdA==");
        return execution.execute(request, data);
    }

}

Перехватчик запросов добавляем в объект RestTemplate:
RestTemplate template = new RestTemplate();
template.getInterceptors().add(new AuthHeaderInterceptor());

После этого можно отправлять запросы через RestTemplate, заголовок в каждый запрос будет добавляться автоматически.
comments powered by Disqus