Em spring-security-oauth2:2.4.0.RELEASE
classes como OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
e ClientCredentialsAccessTokenProvider
foram todos marcados como obsoletos.
No javadoc dessas classes, ele aponta para um guia de migração de segurança de primavera que insinua que as pessoas devem migrar para o projeto principal de segurança de primavera 5. No entanto, estou tendo problemas para descobrir como implementaria meu caso de uso neste projeto.
Toda a documentação e exemplos falam sobre a integração com um provedor OAuth de terceira parte, se você deseja que as solicitações recebidas para seu aplicativo sejam autenticadas e deseja usar o provedor OAuth de terceiros para verificar a identidade.
No meu caso de uso, tudo o que quero fazer é solicitar com um RestTemplate
serviço externo protegido por OAuth. Atualmente, crio um OAuth2ProtectedResourceDetails
com meu ID de cliente e um segredo que eu passo para um OAuth2RestTemplate
. Também tenho um personalizado ClientCredentialsAccessTokenProvider
adicionado ao OAuth2ResTemplate
que apenas adiciona alguns cabeçalhos extras à solicitação de token exigidos pelo provedor OAuth que estou usando.
Na documentação do spring-security 5, encontrei uma seção que menciona a personalização da solicitação de token , mas, novamente, parece estar no contexto de autenticação de uma solicitação de entrada com um provedor OAuth de terceiros. Não está claro como você usaria isso em combinação com algo como a ClientHttpRequestInterceptor
para garantir que cada solicitação de saída para um serviço externo obtenha primeiro um token e depois adicione isso à solicitação.
Também no guia de migração vinculado acima, há uma referência à OAuth2AuthorizedClientService
qual ela diz ser útil para uso em interceptores, mas, novamente, parece que ela se baseia em coisas como a ClientRegistrationRepository
que parece estar onde mantém registros para provedores de terceiros, se você quiser usar que fornecem para garantir que uma solicitação recebida seja autenticada.
Existe alguma maneira de fazer uso da nova funcionalidade do spring-security 5 para registrar provedores OAuth para obter um token a ser adicionado às solicitações de saída do meu aplicativo?
fonte
WebClient
) ou algo semelhante é usado para buscar um token OAuth de um provedor OAuth personalizado (não um dos suportados pelo OoTB como o Facebook / Google) para adicioná-lo a uma solicitação de saída. Todos os exemplos parecem focar na autenticação de solicitações recebidas com outros provedores. Você tem alguma indicação de bons exemplos?WebClient
com o tipo de concessão de credenciais do cliente.A resposta acima de @Anar Sultanov me ajudou a chegar a esse ponto, mas como tive que adicionar alguns cabeçalhos adicionais à minha solicitação de token OAuth, pensei em fornecer uma resposta completa sobre como resolvi o problema no meu caso de uso.
Configurar detalhes do provedor
Adicione o seguinte a
application.properties
Implementar personalizado
ReactiveOAuth2AccessTokenResponseClient
Como esta é uma comunicação servidor a servidor, precisamos usar o
ServerOAuth2AuthorizedClientExchangeFilterFunction
. Isso aceita apenas umReactiveOAuth2AuthorizedClientManager
, não o não reativoOAuth2AuthorizedClientManager
. Portanto, quando usamosReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
(para que o provedor use para fazer a solicitação do OAuth2), precisamos dar a ele um emReactiveOAuth2AuthorizedClientProvider
vez do não-reativoOAuth2AuthorizedClientProvider
. De acordo com a documentação de referência de segurança da mola, se você usar um não reativo,DefaultClientCredentialsTokenResponseClient
poderá usar o.setRequestEntityConverter()
método para alterar a solicitação de token OAuth2, mas o equivalente reativoWebClientReactiveClientCredentialsTokenResponseClient
não fornece esse recurso, portanto, precisamos implementar o nosso próprio (podemos usar aWebClientReactiveClientCredentialsTokenResponseClient
lógica existente ).Minha implementação foi chamada
UaaWebClientReactiveClientCredentialsTokenResponseClient
(implementação omitida, pois altera apenas ligeiramente os métodosheaders()
ebody()
do padrãoWebClientReactiveClientCredentialsTokenResponseClient
para adicionar alguns campos adicionais de cabeçalhos / corpo, não altera o fluxo de autenticação subjacente).Configurar
WebClient
O
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
método foi descontinuado, portanto, seguindo os conselhos de descontinuação desse método:Isso termina com a configuração parecida com:
Use
WebClient
normalmenteAgora, o
oAuth2WebClient
bean está pronto para ser usado para acessar recursos protegidos por nosso provedor OAuth2 configurado da maneira que você faria qualquer outra solicitação usando aWebClient
.fonte
ClientRegistration
s com os detalhes necessários e passá-las ao construtor paraInMemoryReactiveClientRegistrationRepository
(a implementação padrão deReactiveClientRegistrationRepository
). Você, então, usar esse recém-criadoInMemoryReactiveClientRegistrationRepository
feijão no lugar do meu autowiredclientRegistrationRepository
que é passado para ooauthFilteredWebClient
métodoClientRegistration
em tempo de execução, não é? Tanto quanto eu entendi, eu preciso criar um beanClientRegistration
na inicialização.application.properties
arquivo. A implementação própriaReactiveOAuth2AccessTokenResponseClient
permite que você faça qualquer solicitação que você deseja obter um token OAuth2, mas não sei como você poderia fornecer um "contexto" dinâmico por solicitação. O mesmo vale se você implementou seu próprio filtro inteiro. você daria acesso à solicitação de saída, portanto, a menos que você possa inferir o que precisa a partir daí, não tenho certeza de quais são suas opções.Qual é o seu caso de uso? Por que você não conhece os possíveis registros na inicialização?Eu achei a resposta @matt Williams bastante útil. Embora eu queira adicionar caso alguém queira passar programaticamente clientId e secret para a configuração do WebClient. Aqui está como isso pode ser feito.
fonte
Olá, talvez seja tarde demais, no entanto, o RestTemplate ainda é suportado no Spring Security 5, para o aplicativo não reativo RestTemplate ainda é usado, o que você precisa fazer é configurar apenas a segurança do Spring corretamente e criar um interceptador, conforme mencionado no guia de migração
Use a seguinte configuração para usar o fluxo client_credentials
application.yml
Configuração para OauthResTemplate
Interceptor
Isso gerará access_token na primeira chamada e sempre que o token expirar. OAuth2AuthorizedClientManager gerenciará tudo isso para você
fonte