Учитывая топологию:
- Веб-сервис A (Сервер ресурсов A)
- Веб-служба B (Сервер ресурсов B)
- Webservice C (клиент A & B)
- Служба аутентификации (провайдер JWT)
Намерение: C использует OAuth 2.0 Client Credentials для извлечения данных из сервисов A и B (оркестровка).
C реализован как приложение Spring Boot.
Есть ли лучше практика, чем:
- Написать сервис (назовем его
JwtManagementService
), у которого запланированное выполнение (каждые 30 с)
- Проверьте, присутствует ли действительный JWT
- Если нет: запросить новый JWT из службы аутентификации с токеном обновления или учетными данными клиента
- Сохраните его в (распределенном) кэше
- После создания (REST) запроса к любому из ресурсов A или B прочитайте кэшированный JWT (оптимистично, всегда будет действительный JWT)
- Внедрить / использовать JWT в вызове REST (используя
RestTemplate
, WebClient
, Feign
, ...)
Я бы использовал такой JwtManagementService
, потому что:
- Асинхронность между ним и каждым обращением к бэкэндам гарантирует, что существует только один запрос, если отсутствует допустимый JWT. В противном случае 50 параллельных запросов могут привести к 50 запросам JWT и / или заблокировать текущий поток.
- Служба может осуществлять вызовы к различным службам аутентификации и действовать как фасад для своих клиентов.
Недостатком является то, что мне нужно было бы реализовать это самостоятельно.
Если я на правильном пути, мне было бы интересно узнать, есть ли что-то, что может предложить структура. Я немного обеспокоен объявлением 1055 * spring-security-oauth, которое теперь находится в режиме обслуживания.
Кроме того, я не думаю, что я первый, кто ищет такое решение.