W spring-security-oauth2:2.4.0.RELEASE
klasach, takich jak OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
i ClientCredentialsAccessTokenProvider
wszystkie zostały oznaczone jako przestarzałe.
Z javadoc na tych klasach wskazuje przewodnik po wiosennej migracji bezpieczeństwa, który sugeruje, że ludzie powinni migrować do podstawowego projektu wiosennego bezpieczeństwa 5. Mam jednak problem ze znalezieniem sposobu, w jaki mógłbym zaimplementować mój przypadek użycia w tym projekcie.
Cała dokumentacja i przykłady mówią o integracji z zewnętrznym dostawcą OAuth, jeśli chcesz, aby przychodzące żądania do Twojej aplikacji były uwierzytelniane i chcesz użyć zewnętrznego dostawcy OAuth do weryfikacji tożsamości.
W moim przypadku użytkowania chcę jedynie wysłać zapytanie RestTemplate
do usługi zewnętrznej chronionej przez OAuth. Obecnie tworzę OAuth2ProtectedResourceDetails
identyfikator klienta i klucz tajny, które przekazuję OAuth2RestTemplate
. Mam również niestandardowy ClientCredentialsAccessTokenProvider
dodany do, OAuth2ResTemplate
który po prostu dodaje dodatkowe nagłówki do żądania tokenu, które są wymagane przez dostawcę OAuth, którego używam.
W dokumentacji Spring-security 5 znalazłem sekcję, która wspomina o dostosowywaniu żądania tokenu , ale znowu wygląda na to, że jest w kontekście uwierzytelniania przychodzącego żądania z zewnętrznym dostawcą OAuth. Nie jest jasne, w jaki sposób można tego użyć w połączeniu z czymś w rodzaju a, ClientHttpRequestInterceptor
aby upewnić się, że każde wychodzące żądanie do usługi zewnętrznej najpierw pobiera token, a następnie dodaje je do żądania.
Również w powyższym przewodniku migracji znajduje się odniesienie do, OAuth2AuthorizedClientService
które według niego jest przydatne do użycia w przechwytywaczach, ale znowu wygląda na to, że opiera się na takich rzeczach, jak się ClientRegistrationRepository
wydaje, gdy zachowuje rejestracje dla dostawców zewnętrznych, jeśli chcesz użyć które zapewniają, że przychodzące żądanie jest uwierzytelniane.
Czy jest jakiś sposób, aby wykorzystać nową funkcjonalność Spring-security 5 do rejestracji dostawców OAuth w celu uzyskania tokena do dodania do wychodzących żądań z mojej aplikacji?
źródło
WebClient
) lub coś podobnego jest używane do pobrania tokena OAuth z niestandardowy dostawca OAuth (nie jeden z obsługiwanych OoTB, takich jak Facebook / Google) w celu dodania go do żądania wychodzącego. Wszystkie przykłady wydają się koncentrować na uwierzytelnianiu przychodzących wniosków z innymi dostawcami. Czy masz jakieś wskazówki dla dobrych przykładów?WebClient
z typem przyznania referencji klienta.Powyższa odpowiedź od @Anar Sultanov pomogła mi dojść do tego punktu, ale ponieważ musiałem dodać kilka dodatkowych nagłówków do mojej prośby o token OAuth, pomyślałem, że udzielę pełnej odpowiedzi na pytanie, jak rozwiązałem problem w moim przypadku użycia.
Skonfiguruj dane dostawcy
Dodaj następujące elementy do
application.properties
Wdróż niestandardowe
ReactiveOAuth2AccessTokenResponseClient
Ponieważ jest to komunikacja między serwerami, musimy skorzystać z
ServerOAuth2AuthorizedClientExchangeFilterFunction
. To akceptuje tylkoReactiveOAuth2AuthorizedClientManager
niereaktywneOAuth2AuthorizedClientManager
. Dlatego kiedy używamyReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
(aby dać temu dostawcy, aby używał do żądania OAuth2), musimy dać muReactiveOAuth2AuthorizedClientProvider
zamiast nieaktywnegoOAuth2AuthorizedClientProvider
. Zgodnie z dokumentacją referencyjną zabezpieczenia sprężynowego, jeśli używasz niereaktywnegoDefaultClientCredentialsTokenResponseClient
, możesz użyć.setRequestEntityConverter()
metody zmiany żądania tokena OAuth2, ale reaktywny odpowiednikWebClientReactiveClientCredentialsTokenResponseClient
nie zapewnia tej funkcji, więc musimy wdrożyć własne (możemy skorzystać z istniejącaWebClientReactiveClientCredentialsTokenResponseClient
logika).Moja implementacja została wywołana
UaaWebClientReactiveClientCredentialsTokenResponseClient
(implementacja została pominięta, ponieważ tylko nieznacznie zmienia metodyheaders()
ibody()
od wartości domyślnych wWebClientReactiveClientCredentialsTokenResponseClient
celu dodania dodatkowych nagłówków / pól treści, nie zmienia podstawowego przepływu uwierzytelniania).Konfiguruj
WebClient
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
Metoda została zaniechana, więc za radą Wycofanie z tej metody:W rezultacie konfiguracja wygląda mniej więcej tak:
Używaj
WebClient
jak zwykleoAuth2WebClient
Bean jest teraz gotowa do użycia dostępu do zasobów chronionych przez naszego dostawcę OAuth2 skonfigurowane w taki sposób, by można zrobić każdy inny wniosek użyciemWebClient
.źródło
ClientRegistration
z wymaganymi szczegółami i przekazać je do konstruktora dlaInMemoryReactiveClientRegistrationRepository
(domyślna implementacjaReactiveClientRegistrationRepository
). Następnie używasz tej nowo utworzonejInMemoryReactiveClientRegistrationRepository
fasoli zamiast mojego autowiredowanego,clientRegistrationRepository
który jest przekazywany dooauthFilteredWebClient
metodyClientRegistration
w czasie wykonywania, prawda? O ile rozumiem, muszę stworzyć fasolęClientRegistration
przy starcie.application.properties
pliku. Wdrożenie własnegoReactiveOAuth2AccessTokenResponseClient
pozwala na wykonanie dowolnego żądania, które chcesz uzyskać token OAuth2, ale nie wiem, w jaki sposób można zapewnić dynamiczny „kontekst” dla każdego żądania. To samo dotyczy, jeśli zaimplementowałeś własny filtr. dałbym ci dostęp do wychodzącej prośby, więc jeśli nie możesz wywnioskować z tego, czego potrzebujesz, nie jestem pewien, jakie masz opcje. Jaki jest twój przypadek użycia? Dlaczego nie znasz możliwych rejestracji podczas uruchamiania?Odpowiedź @matta Williamsa była bardzo pomocna. Chociaż chciałbym dodać na wypadek, gdyby ktoś chciał programowo przekazać clientId i sekret dla konfiguracji WebClient. Oto jak można to zrobić.
źródło
Cześć, może jest już za późno, jednak RestTemplate jest nadal obsługiwany w Spring Security 5, do niereaktywnej aplikacji RestTemplate jest nadal używany, musisz tylko odpowiednio skonfigurować zabezpieczenia Spring i utworzyć przechwytywacz, jak wspomniano w przewodniku migracji
Użyj następującej konfiguracji, aby użyć przepływu poświadczeń_klienta
application.yml
Konfiguracja do OauthResTemplate
Przechwytywacz
To wygeneruje access_token w pierwszym wywołaniu i za każdym razem, gdy token straci ważność. OAuth2AuthorizedClientManager zarządza tym wszystkim
źródło