Dans des spring-security-oauth2:2.4.0.RELEASE
classes telles que OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
et ClientCredentialsAccessTokenProvider
ont toutes été marquées comme obsolètes.
À partir du javadoc sur ces classes, il pointe vers un guide de migration de sécurité de printemps qui insinue que les gens doivent migrer vers le projet principal de sécurité de printemps 5. Cependant, j'ai du mal à trouver comment j'implémenterais mon cas d'utilisation dans ce projet.
Toute la documentation et les exemples parlent de l'intégration avec un fournisseur OAuth tiers si vous souhaitez que les demandes entrantes à votre application soient authentifiées et que vous souhaitez utiliser le fournisseur OAuth tiers pour vérifier l'identité.
Dans mon cas d'utilisation, tout ce que je veux faire est de faire une demande avec un RestTemplate
à un service externe protégé par OAuth. Actuellement, je crée un OAuth2ProtectedResourceDetails
avec mon identifiant client et mon secret que je passe dans un OAuth2RestTemplate
. J'ai également ClientCredentialsAccessTokenProvider
ajouté une coutume OAuth2ResTemplate
qui ajoute simplement des en-têtes supplémentaires à la demande de jeton qui sont requis par le fournisseur OAuth que j'utilise.
Dans la documentation de spring-security 5, j'ai trouvé une section qui mentionne la personnalisation de la demande de jeton , mais qui semble être dans le contexte de l'authentification d'une demande entrante avec un fournisseur OAuth tiers. Il n'est pas clair comment vous utiliseriez cela en combinaison avec quelque chose comme un ClientHttpRequestInterceptor
pour vous assurer que chaque demande sortante à un service externe obtient d'abord un jeton, puis obtient celui ajouté à la demande.
Dans le guide de migration lié ci-dessus, il est également fait référence à un document OAuth2AuthorizedClientService
qui, selon lui, est utile pour les intercepteurs, mais encore une fois, il semble qu'il s'appuie sur des choses comme le ClientRegistrationRepository
qui semble être l'endroit où il maintient les enregistrements pour les fournisseurs tiers si vous souhaitez utiliser qui fournissent pour garantir qu'une demande entrante est authentifiée.
Existe-t-il un moyen d'utiliser les nouvelles fonctionnalités de Spring-Security 5 pour enregistrer les fournisseurs OAuth afin d'obtenir un jeton à ajouter aux demandes sortantes de mon application?
la source
WebClient
) ou quelque chose de similaire est utilisé pour récupérer un jeton OAuth à partir d'un fournisseur OAuth personnalisé (pas l'un de ceux pris en charge OoTB comme Facebook / Google) afin de l'ajouter à une demande sortante. Tous les exemples semblent se concentrer sur l'authentification des demandes entrantes avec d'autres fournisseurs. Avez-vous des conseils pour de bons exemples?WebClient
avec le type d'octroi des informations d'identification client.La réponse ci-dessus de @Anar Sultanov m'a aidé à arriver à ce point, mais comme je devais ajouter des en-têtes supplémentaires à ma demande de jeton OAuth, j'ai pensé fournir une réponse complète sur la façon dont j'ai résolu le problème pour mon cas d'utilisation.
Configurer les détails du fournisseur
Ajoutez ce qui suit à
application.properties
Implémenter personnalisé
ReactiveOAuth2AccessTokenResponseClient
Comme il s'agit d'une communication de serveur à serveur, nous devons utiliser le
ServerOAuth2AuthorizedClientExchangeFilterFunction
. Cela n'accepte qu'unReactiveOAuth2AuthorizedClientManager
, pas le non réactifOAuth2AuthorizedClientManager
. Par conséquent, lorsque nous utilisonsReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
(pour lui donner le fournisseur à utiliser pour effectuer la demande OAuth2), nous devons lui donner unReactiveOAuth2AuthorizedClientProvider
au lieu du non réactifOAuth2AuthorizedClientProvider
. Selon la documentation de référence de Spring-Security, si vous utilisez une méthode non réactive,DefaultClientCredentialsTokenResponseClient
vous pouvez utiliser la.setRequestEntityConverter()
méthode pour modifier la demande de jeton OAuth2, mais l'équivalent réactifWebClientReactiveClientCredentialsTokenResponseClient
ne fournit pas cette fonctionnalité, nous devons donc implémenter la nôtre (nous pouvons utiliser laWebClientReactiveClientCredentialsTokenResponseClient
logique existante ).Mon implémentation a été appelée
UaaWebClientReactiveClientCredentialsTokenResponseClient
(implémentation omise car elle ne modifie que très légèrement les méthodesheaders()
etbody()
par défautWebClientReactiveClientCredentialsTokenResponseClient
pour ajouter des en-têtes / champs de corps supplémentaires, elle ne modifie pas le flux d'authentification sous-jacent).Configurer
WebClient
La
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
méthode a été déconseillée. Suivez donc les conseils de dépréciation de cette méthode:Cela se termine par une configuration ressemblant à quelque chose comme:
Utiliser
WebClient
comme d'habitudeLe
oAuth2WebClient
bean est maintenant prêt à être utilisé pour accéder aux ressources protégées par notre fournisseur OAuth2 configuré comme vous le feriez pour toute autre demande à l'aide de aWebClient
.la source
ClientRegistration
s avec les détails requis et les transmettre au constructeur deInMemoryReactiveClientRegistrationRepository
(l'implémentation par défaut deReactiveClientRegistrationRepository
). Vous utilisez ensuite ceInMemoryReactiveClientRegistrationRepository
bean nouvellement créé à la place de mon câble automatiqueclientRegistrationRepository
qui est passé dans laoauthFilteredWebClient
méthodeClientRegistration
à l'exécution, n'est -ce pas? Pour autant que j'ai compris, je dois créer un beanClientRegistration
au démarrage.application.properties
fichier. Implémenter le vôtreReactiveOAuth2AccessTokenResponseClient
vous permet de faire la requête que vous souhaitez pour obtenir un jeton OAuth2, mais je ne sais pas comment vous pouvez lui fournir un "contexte" dynamique par requête. Il en va de même si vous avez implémenté votre propre filtre en entier. Tout cela vous donnerait accès à la demande sortante, donc à moins que vous ne puissiez en déduire ce dont vous avez besoin, je ne suis pas sûr de vos options. Quel est votre cas d'utilisation? Pourquoi ne sauriez-vous pas les enregistrements possibles au démarrage?J'ai trouvé la réponse de @matt Williams très utile. Bien que j'aimerais ajouter au cas où quelqu'un voudrait transmettre par programme clientId et secret pour la configuration WebClient. Voici comment cela peut être fait.
la source
Salut, il est peut-être trop tard, mais RestTemplate est toujours pris en charge dans Spring Security 5, pour une application non réactive RestTemplate est toujours utilisé ce que vous devez faire est de configurer correctement la sécurité Spring et de créer un intercepteur comme mentionné dans le guide de migration
Utilisez la configuration suivante pour utiliser le flux client_credentials
application.yml
Configuration vers OauthResTemplate
Intercepteur
Cela générera access_token lors du premier appel et à chaque expiration du jeton. OAuth2AuthorizedClientManager gérera tout cela pour vous
la source