Как получить токен доступа oauth2 в приложении весенней загрузки (не в веб-приложении) с помощью Spring Security 5 - PullRequest
0 голосов
/ 11 февраля 2020

Мне нужно получить токен доступа (grant_type = client_credentials) в сервисном слое моего весеннего загрузочного приложения, чтобы общаться с другим микросервисом (сервис-сервисное взаимодействие). На этом уровне нет весенней http сессии или авторизации, у меня просто есть client_id, client_secret и token url. Эти свойства устанавливаются в application.properties как:

spring.security.oauth2.client.registration.auth1.client-id=***
spring.security.oauth2.client.registration.auth1.client-secret=***
spring.security.oauth2.client.registration.auth1.authorization-grant-type=client_credentials
spring.security.oauth2.client.provider.auth1.tokenUri=***

Это казалось простым с Spring Security OAuth, но не может выяснить с Spring Security. Направил документы на Spring Security 5, но, похоже, все в контексте веб-интерфейса. Я понимаю, что мог бы просто сделать http-вызов, чтобы получить токен с имеющейся у меня информацией, но я хотел использовать каркас ...

Сценарий. Позволяет вызывать эту весеннюю загрузочную службу приложения A. Существуют другие службы, которые может вызвать A для обработки обновлений по http или отправить сообщение kafka на topi c, который слушает A. Когда A обрабатывает обновление / сообщение, ему нужно отправить некоторые данные в службу B, которой требуется токен доступа для authz. Здесь мне нужен токен доступа. Таким образом, взаимодействие по сути является сервис-сервис и не указывается c для пользователя.

1 Ответ

0 голосов
/ 11 февраля 2020

Если вы не в контексте веб-интерфейса, вам нужно взглянуть на уровень сервиса.

Из Javadocs Spring Security для AuthorizedClientServiceOAuth2AuthorizedClientManager:

Реализация {@link OAuth2AuthorizedClientManager}, способная работать вне контекста {@code HttpServletRequest}, например, в запланированный / фоновый поток и / или на уровне обслуживания.

Вот определение @Bean, которое может помочь, которое я объясню ниже:

    @Bean
    OAuth2AuthorizedClientManager authorizedClientManager
            (ClientRegistrationRepository clients) {
        OAuth2AuthorizedClientService service = 
                new InMemoryOAuth2AuthorizedClientService(clients);
        AuthorizedClientServiceOAuth2AuthorizedClientManager manager =
                new AuthorizedClientServiceOAuth2AuthorizedClientManager(clients, service);
        OAuth2AuthorizedClientProvider authorizedClientProvider =
                OAuth2AuthorizedClientProviderBuilder.builder()
                        .clientCredentials()
                        .build();
        manager.setAuthorizedClientProvider(authorizedClientProvider);
        return manager;
    }

An OAuth2AuthorizedClientManager управляет авторизацией определений клиента OAuth 2.0. Эти определения хранятся в ClientRegistrationRepository, и Spring Boot создает экземпляр по умолчанию ClientRegistrationRepository через свойства, которые вы уже определили.

Для менеджера обычно необходимы две функции:

  • Первым является OAuth2AuthorizedClientService, что удобно, если вы хотите хранить токены в базе данных - в Spring Security 5.2 единственная реализация - это встроенная в память; однако, похоже, что 5.3 будет поставляться с реализацией JDB C .

  • Вторым является OAuth2AuthorizedClientProvider, который фактически выполняет запросы токена Как учетные данные клиента, который вы хотите сделать.

Создав этот менеджер, вы можете подключить его к своему веб-клиенту:

    @Bean
    WebClient webClient(OAuth2AuthorizedClientManager authorizedClientManager) {
        ServletOAuth2AuthorizedClientExchangeFilterFunction oauth2 =
                new ServletOAuth2AuthorizedClientExchangeFilterFunction
                        (authorizedClientManager);
        oauth2.setDefaultClientRegistrationId("auth1");
        return WebClient.builder()
                .apply(oauth2.oauth2Configuration())
                .build();
    }

Использованная выше функция фильтра обмена - это то, что добавляет токен носителя к заголовок Authorization. Он звонит менеджеру, чтобы спросить его о токене, менеджер извлекает его из службы. Если срок его действия истек, менеджер просит поставщика обновить его sh. Теперь с токеном fre sh менеджер возвращает его обратно в фильтр, чтобы добавить его в запрос.

...