В spring-security-oauth2:2.4.0.RELEASE
классах , таких как OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
и ClientCredentialsAccessTokenProvider
все были помечены как нежелательные.
От javadoc для этих классов это указывает на руководство по миграции безопасности Spring, которое подсказывает, что люди должны перейти к основному проекту Spring-Security 5. Однако у меня возникают проблемы с поиском того, как бы я реализовал свой вариант использования в этом проекте.
Во всей документации и примерах рассказывается об интеграции с 3-сторонним поставщиком OAuth, если вы хотите, чтобы входящие запросы к вашему приложению были аутентифицированы, и вы хотите использовать сторонний OAuth-поставщик для проверки личности.
В моем случае использования все, что я хочу сделать, это сделать запрос RestTemplate
к внешнему сервису, защищенному OAuth. В настоящее время я создаю OAuth2ProtectedResourceDetails
свой идентификатор клиента и секрет, который я передаю в OAuth2RestTemplate
. Я также обычай ClientCredentialsAccessTokenProvider
добавил в OAuth2ResTemplate
том , что только добавляет некоторые дополнительные заголовки в маркер запроса, которые требуются от поставщика OAuth я использую.
В документации Spring-Security 5 я нашел раздел, в котором упоминается настройка запроса токена , но опять-таки он выглядит в контексте аутентификации входящего запроса у стороннего поставщика OAuth. Непонятно, как бы вы использовали это в сочетании с чем-то вроде a, ClientHttpRequestInterceptor
чтобы каждый исходящий запрос к внешней службе сначала получал токен, а затем добавлял его в запрос.
Также в приведенном выше руководстве по миграции есть ссылка на то, OAuth2AuthorizedClientService
что, по его словам, полезно использовать в перехватчиках, но опять-таки это похоже на то, что оно опирается на такие вещи, ClientRegistrationRepository
которые, по-видимому, и поддерживают регистрацию сторонних поставщиков, если вы хотите использовать которые обеспечивают проверку входящего запроса.
Можно ли каким-то образом использовать новые функции Spring-Security 5 для регистрации поставщиков OAuth, чтобы получить токен для добавления к исходящим запросам из моего приложения?
источник
WebClient
) или что-то подобное используется для получения токена OAuth из пользовательский поставщик OAuth (не один из поддерживаемых OoTB, как Facebook / Google), чтобы добавить его в исходящий запрос. Все примеры, кажется, сосредоточены на аутентификации входящих запросов с другими провайдерами. Есть ли у вас какие-либо указатели для каких-либо хороших примеров?WebClient
с типом предоставления учетных данных клиента.Приведенный выше ответ @Anar Sultanov помог мне добраться до этой точки, но, поскольку мне пришлось добавить несколько дополнительных заголовков к моему запросу токена OAuth, я подумал, что предоставлю полный ответ о том, как я решил проблему для своего варианта использования.
Настроить детали провайдера
Добавьте следующее к
application.properties
Реализуйте пользовательские
ReactiveOAuth2AccessTokenResponseClient
Поскольку это межсерверная связь, нам нужно использовать
ServerOAuth2AuthorizedClientExchangeFilterFunction
. Это только принимаетReactiveOAuth2AuthorizedClientManager
, а не реагируетOAuth2AuthorizedClientManager
. Поэтому, когда мы используемReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
(чтобы поставщик использовал его для выполнения запроса OAuth2), мы должны предоставить егоReactiveOAuth2AuthorizedClientProvider
вместо нереактивногоOAuth2AuthorizedClientProvider
. Согласно справочной документации по безопасности пружин, если вы используете нереактивный,DefaultClientCredentialsTokenResponseClient
вы можете использовать.setRequestEntityConverter()
метод для изменения запроса токена OAuth2, но реактивный эквивалентWebClientReactiveClientCredentialsTokenResponseClient
не предоставляет эту возможность, поэтому мы должны реализовать свое собственное (мы можем использовать существующаяWebClientReactiveClientCredentialsTokenResponseClient
логика).Моя реализация была вызвана
UaaWebClientReactiveClientCredentialsTokenResponseClient
(реализация опущена, поскольку она лишь очень незначительно изменяет методыheaders()
иbody()
по умолчаниюWebClientReactiveClientCredentialsTokenResponseClient
для добавления некоторых дополнительных полей заголовков / тела, она не меняет основной поток аутентификации).Настройка
WebClient
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
Метод устарел, поэтому следуя совету устаревания от этого метода:В итоге конфигурация выглядит примерно так:
Используйте
WebClient
как обычноТеперь
oAuth2WebClient
bean-компонент готов к использованию для доступа к ресурсам, защищенным нашим сконфигурированным поставщиком OAuth2, таким же образом, как если бы вы выполняли любой другой запрос, используя aWebClient
.источник
ClientRegistration
s с необходимыми деталями и передать их в конструкторInMemoryReactiveClientRegistrationRepository
(реализация по умолчаниюReactiveClientRegistrationRepository
). Затем вы используете этот недавно созданныйInMemoryReactiveClientRegistrationRepository
боб вместо моего автопровода,clientRegistrationRepository
который передается вoauthFilteredWebClient
методClientRegistration
во время выполнения, не так ли? Насколько я понял, мне нужно создать компонентClientRegistration
при запуске.application.properties
файле. Реализация собственногоReactiveOAuth2AccessTokenResponseClient
позволяет вам сделать любой запрос, который вы хотите получить токен OAuth2, но я не знаю, как вы могли бы предоставить ему динамический «контекст» для каждого запроса. То же самое можно сказать, если вы реализовали свой собственный полный фильтр. Все это дал бы вам доступ к исходящему запросу, поэтому, если вы не сможете определить, что вам нужно оттуда, я не уверен, какие у вас есть варианты. Каков ваш вариант использования? Почему вы не знаете возможные регистрации при запуске?Я нашел ответ @matt Williams весьма полезным. Хотя я хотел бы добавить, если кто-то хотел бы программно передать clientId и секрет для конфигурации WebClient. Вот как это можно сделать.
источник
Привет, может быть, уже слишком поздно, но RestTemplate все еще поддерживается в Spring Security 5, чтобы нереактивное приложение все еще используется RestTemplate, вам нужно только правильно настроить Spring Security и создать перехватчик, как указано в руководстве по миграции.
Используйте следующую конфигурацию для использования потока client_credentials
application.yml
Конфигурация для OauthResTemplate
истребитель-перехватчик
Это сгенерирует access_token при первом вызове и всякий раз, когда токен истекает. OAuth2AuthorizedClientManager будет управлять всем этим вам
источник