In spring-security-oauth2:2.4.0.RELEASE
Klassen wie OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
und ClientCredentialsAccessTokenProvider
alle haben markiert als veraltet.
Aus dem Javadoc zu diesen Klassen geht hervor, dass ein Leitfaden zur Migration der Frühlingssicherheit darauf hinweist, dass Personen zum Kernprojekt der Frühlingssicherheit 5 migrieren sollten. Ich habe jedoch Probleme zu finden, wie ich meinen Anwendungsfall in diesem Projekt implementieren würde.
In der gesamten Dokumentation und in den Beispielen wird die Integration in einen OAuth-Anbieter eines Drittanbieters beschrieben, wenn eingehende Anforderungen an Ihre Anwendung authentifiziert werden sollen und Sie den OAuth-Anbieter eines Drittanbieters zur Überprüfung der Identität verwenden möchten.
In meinem Anwendungsfall möchte ich lediglich eine Anfrage RestTemplate
an einen externen Dienst stellen, der durch OAuth geschützt ist. Derzeit erstelle ich eine OAuth2ProtectedResourceDetails
mit meiner Kunden-ID und meinem Geheimnis, die ich an eine weitergebe OAuth2RestTemplate
. Ich habe auch eine benutzerdefinierte ClientCredentialsAccessTokenProvider
hinzugefügt, die OAuth2ResTemplate
nur einige zusätzliche Header zur Token-Anforderung hinzufügt, die von dem von mir verwendeten OAuth-Anbieter benötigt werden.
In der Spring-Security 5-Dokumentation habe ich einen Abschnitt gefunden, in dem das Anpassen der Token-Anforderung erwähnt wird , der jedoch wiederum im Zusammenhang mit der Authentifizierung einer eingehenden Anforderung bei einem OAuth-Anbieter eines Drittanbieters steht. Es ist nicht klar, wie Sie dies in Kombination mit so etwas wie a verwenden würden, ClientHttpRequestInterceptor
um sicherzustellen, dass jede ausgehende Anforderung an einen externen Dienst zuerst ein Token erhält und dieses dann zur Anforderung hinzufügt.
Auch in dem oben verlinkten Migrationshandbuch wird auf ein Verweis verwiesen, von OAuth2AuthorizedClientService
dem es sagt, dass es für die Verwendung in Interceptors nützlich ist, aber auch dies ClientRegistrationRepository
scheint auf Dingen wie dem zu beruhen , in denen Registrierungen für Drittanbieter verwaltet werden, wenn Sie diese verwenden möchten Diese sorgen dafür, dass eine eingehende Anfrage authentifiziert wird.
Gibt es eine Möglichkeit, die neue Funktionalität in Spring-Security 5 zum Registrieren von OAuth-Anbietern zu nutzen, um ein Token zu erhalten, das ausgehenden Anforderungen aus meiner Anwendung hinzugefügt werden kann?
quelle
WebClient
ist) oder ähnliches verwendet wird, um ein OAuth-Token von a abzurufen Benutzerdefinierter OAuth-Anbieter (keiner der OoTB-unterstützten Anbieter wie Facebook / Google), um ihn einer ausgehenden Anfrage hinzuzufügen. Alle Beispiele scheinen sich auf die Authentifizierung eingehender Anfragen bei anderen Anbietern zu konzentrieren. Haben Sie Hinweise für gute Beispiele?WebClient
mit dem Grant-Typ für Client-Anmeldeinformationen aktualisiert .Die obige Antwort von @Anar Sultanov hat mir geholfen, an diesen Punkt zu gelangen, aber da ich meiner OAuth-Token-Anfrage einige zusätzliche Header hinzufügen musste, dachte ich, ich würde eine vollständige Antwort darauf geben, wie ich das Problem für meinen Anwendungsfall gelöst habe.
Konfigurieren Sie die Providerdetails
Fügen Sie Folgendes hinzu:
application.properties
Implementieren Sie benutzerdefinierte
ReactiveOAuth2AccessTokenResponseClient
Da dies eine Server-zu-Server-Kommunikation ist, müssen wir die verwenden
ServerOAuth2AuthorizedClientExchangeFilterFunction
. Dies akzeptiert nur aReactiveOAuth2AuthorizedClientManager
, nicht das nicht reaktiveOAuth2AuthorizedClientManager
. Daher müssen wir bei der VerwendungReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
(um dem Anbieter die OAuth2-Anforderung zu geben) eineReactiveOAuth2AuthorizedClientProvider
anstelle der nicht reaktiven gebenOAuth2AuthorizedClientProvider
. Gemäß der Spring-Security-ReferenzdokumentationDefaultClientCredentialsTokenResponseClient
können Sie die.setRequestEntityConverter()
Methode zum Ändern der OAuth2-Token-Anforderung verwenden, wenn Sie eine nicht reaktive verwenden. Das reaktive ÄquivalentWebClientReactiveClientCredentialsTokenResponseClient
bietet diese Funktion jedoch nicht. Daher müssen wir unsere eigene implementieren (wir können sie verwenden) die bestehendeWebClientReactiveClientCredentialsTokenResponseClient
Logik).Meine Implementierung wurde aufgerufen
UaaWebClientReactiveClientCredentialsTokenResponseClient
(die Implementierung wurde weggelassen, da sie die Methodenheaders()
und nur geringfügigbody()
von der StandardeinstellungWebClientReactiveClientCredentialsTokenResponseClient
zum Hinzufügen einiger zusätzlicher Header / Body-Felder ändert und den zugrunde liegenden Authentifizierungsfluss nicht ändert).Konfigurieren
WebClient
Die
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
Methode wurde veraltet. Befolgen Sie daher die Empfehlungen zur Abschreibung dieser Methode:Dies führt dazu, dass die Konfiguration ungefähr so aussieht:
Verwendung
WebClient
als normalDie
oAuth2WebClient
Bean kann jetzt verwendet werden, um auf Ressourcen zuzugreifen, die von unserem konfigurierten OAuth2-Anbieter geschützt werden, so wie Sie jede andere Anforderung mit a stellen würdenWebClient
.quelle
ClientRegistration
s mit den erforderlichen Details erstellen und diese an den Konstruktor fürInMemoryReactiveClientRegistrationRepository
(die Standardimplementierung vonReactiveClientRegistrationRepository
) übergeben. Sie verwenden dann diese neu erstellteInMemoryReactiveClientRegistrationRepository
Bohne anstelle meiner automatisch verdrahteten BohneclientRegistrationRepository
, die an dieoauthFilteredWebClient
Methode übergeben wirdClientRegistration
Laufzeit nicht anders registrieren , oder? Soweit ich verstanden habe, muss ichClientRegistration
beim Start eine Bean erstellen .application.properties
Datei deklarieren . Ihre eigene Implementierung vonReactiveOAuth2AccessTokenResponseClient
ermöglicht es Ihnen , zu machen , was fordern Sie die OAuth2 Token zu bekommen, aber ich weiß nicht , wie Sie einen dynamischen „Kontext‘ , um es per Anfrage zur Verfügung stellen könnten. Das gleiche gilt für geht , wenn Sie Ihre eigenen gesamten Filter implementiert. Das alles Wenn Sie nicht ableiten könnten, was Sie von dort benötigen, bin ich mir nicht sicher, welche Optionen Sie haben. Was ist Ihr Anwendungsfall? Warum sollten Sie die möglichen Registrierungen beim Start nicht kennen?Ich fand @matt Williams Antwort ziemlich hilfreich. Ich möchte jedoch hinzufügen, falls jemand die Client-ID und das Geheimnis für die WebClient-Konfiguration programmgesteuert übergeben möchte. So kann es gemacht werden.
quelle
Hallo, vielleicht ist es zu spät, aber RestTemplate wird in Spring Security 5 weiterhin unterstützt. Für nicht reaktive Apps wird RestTemplate weiterhin verwendet. Sie müssen lediglich die Federsicherheit ordnungsgemäß konfigurieren und einen Interceptor erstellen, wie im Migrationshandbuch angegeben
Verwenden Sie die folgende Konfiguration, um den Fluss client_credentials zu verwenden
application.yml
Konfiguration zu OauthResTemplate
Abfangjäger
Dies generiert access_token beim ersten Aufruf und immer dann, wenn das Token abgelaufen ist. OAuth2AuthorizedClientManager verwaltet all dies für Sie
quelle