Ошибка инициализация контекста Spring при недоступности Identity Provider в приложении Jmix c авторизацией по протоколу OAuth2

Здравствуйте!

Исходные данные: Jmix version 2.4.0, spring-boot-starter-oauth2-client-3.3.4

Мы используем два вида аутентификации пользователей, один из которых по протоколу OAuth2. По требованиям заказчика, если Identity Provider сервер не доступен, то приложение должно работать и аутентифицировать пользователей другим способом, но в реальности если сервер не доступен приложение падает на этапе инициализации контекста Spring. У меня пока нет понимания, как можно избежать или обработать ошибку, чтобы приложение могло запуститься при недоступности Identity Provider и смогло осуществлять аутентификацию после восстановления доступности. Может вы сможете подсказать хотя бы направление действий, все-таки у вас есть опыт разработки плагина OpenID Connect. Заранее спасибо за любую помощь.

Для имитации ошибки можно использовать jmix-social-login-sample. Если использовать сторонний сервер, например keycloak или демо версию Blitz Demo, то получаем ошибку, если предопределенные профили GitHub или Google, то нет. Скрин и стек ошибок прикладываю, демо клиента Blitz Identity provider можно задействовать

Error

error.zip (2.9 КБ)

Здравствуйте, @turchev.

В документации Spring Boot есть пример настройки кастомного Identity Provider без issue-uri. Свойство spring.security.oauth2.client.provider.blitz.issue-uri при старте приложения используется для получения метаданных, например, таких как jwk-set-uri, user-info-uri. Такое поведение можно увидеть в реализации org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientPropertiesMapper#getBuilderFromIssuerIfPossible. Поэтому при недоступности Identity Provider приложение не запускается, т.к. не удается создать необходимый бин.

Также в выше указанной документации Spring Boot есть пример программного создания ClientRegistration.

С уважением,
Мария.

1 симпатия

Добрый день, Мария.

Потихоньку уже разобрался и в целом в том же направлении пошел, правда не стал полностью отказываться от автоконфигурации - переопределил Bean org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientRegistrationRepositoryConfiguration#clientRegistrationRepository, а в нем обернул в try-catch метод asClientRegistrations(). Если вылетает ошибка, то тогда уже создаем программно ClientRegistration по тем же пропертям и дальше продолжаем процесс инициализации InMemoryClientRegistrationRepository.

За помощь спасибо, это добавило уверенности в правильности выбранного решения, ну и кому-то еще может пригодиться

С уважением, Павел