Как добавить поддержку токена авторизации в REST клиенте Spring
Что проверяют
Для аналитика это вопрос не про синтаксис, а про интеграцию: откуда берётся токен, как он попадает в запрос, что происходит при его истечении и как описать это в постановке разработчику. Следом обычно просят объяснить, чем OAuth 2.0 client credentials отличается от статического ключа.
Как отвечать
Сначала механика. Токен передаётся в заголовке Authorization: Bearer <token>. Для межсервисных вызовов его обычно получают у сервера авторизации по потоку client credentials: сервис отправляет client_id и секрет, получает access token с коротким сроком жизни и переиспользует его до истечения.
Затем где это живёт в Spring, чтобы читать код и ставить задачу предметно:
RestClient: современный синхронный клиент, заголовок добавляется черезdefaultHeaderилиrequestInterceptorпри сборкеRestClient.builder();RestTemplate: в режиме поддержки, токен добавляет своя реализацияClientHttpRequestInterceptor, подключённая черезRestTemplateBuilder;WebClient: реактивный клиент, для него пишутExchangeFilterFunction;- OpenFeign: интерфейс
RequestInterceptor; - Spring Security OAuth2 Client: сам получает и обновляет токен. Для
RestClientв свежих версиях есть готовыйOAuth2ClientHttpRequestInterceptor, настройки лежат вspring.security.oauth2.client.registration.
В постановке зафиксируйте схему авторизации, адрес получения токена, скоупы, срок жизни и поведение при ошибках: при 401 один раз обновить токен и повторить запрос, при 403 не повторять, это нехватка прав. Отдельно: токен не пишется в логи, секрет лежит в хранилище секретов, а не в коде.
Где спотыкаются
Путают исходящие вызовы с защитой своего API. spring-boot-starter-security закрывает ваши эндпоинты, а к запросам клиента заголовок сам не добавит, для этого нужен перехватчик или OAuth2 Client.
Описывают токен как константу в конфигурации. Access token живёт минуты, и такая интеграция сломается ровно через срок жизни первого токена.
Не описывают ошибки. Без правила для 401 разработчик либо не станет обновлять токен, либо уйдёт в бесконечные повторы, и при сбое сервера авторизации вызовы лягут лавиной.