Di spring-security-oauth2:2.4.0.RELEASE
kelas-kelas seperti OAuth2RestTemplate
, OAuth2ProtectedResourceDetails
dan ClientCredentialsAccessTokenProvider
semuanya telah ditandai sebagai usang.
Dari javadoc pada kelas-kelas ini itu menunjuk ke panduan migrasi keamanan pegas yang mengisyaratkan bahwa orang harus bermigrasi ke proyek inti-keamanan 5 musim semi. Namun saya mengalami kesulitan menemukan bagaimana saya akan menerapkan use case saya dalam proyek ini.
Semua dokumentasi dan contoh berbicara tentang integrasi dengan penyedia OAuth bagian ke-3 jika Anda ingin permintaan masuk ke aplikasi Anda diautentikasi dan Anda ingin menggunakan penyedia OAuth pihak ke-3 untuk memverifikasi identitas.
Dalam kasus penggunaan saya, yang ingin saya lakukan adalah membuat permintaan dengan RestTemplate
ke layanan eksternal yang dilindungi oleh OAuth. Saat ini saya membuat OAuth2ProtectedResourceDetails
dengan id klien dan rahasia yang saya berikan menjadi OAuth2RestTemplate
. Saya juga memiliki kustom yang ClientCredentialsAccessTokenProvider
ditambahkan ke OAuth2ResTemplate
yang hanya menambahkan beberapa header tambahan ke permintaan token yang diperlukan oleh penyedia OAuth yang saya gunakan.
Dalam dokumentasi spring-security 5 saya telah menemukan bagian yang menyebutkan menyesuaikan permintaan token , tetapi sekali lagi yang terlihat dalam konteks mengotentikasi permintaan masuk dengan penyedia OAuth pihak ke-3. Tidak jelas bagaimana Anda akan menggunakan ini dalam kombinasi dengan sesuatu seperti ClientHttpRequestInterceptor
untuk memastikan bahwa setiap permintaan keluar ke layanan eksternal pertama mendapat token dan kemudian mendapatkan yang ditambahkan ke permintaan.
Juga dalam panduan migrasi yang ditautkan di atas ada referensi OAuth2AuthorizedClientService
yang dikatakan berguna untuk digunakan dalam pencegat, tetapi sekali lagi ini sepertinya bergantung pada hal-hal seperti ClientRegistrationRepository
yang tampaknya berada di mana ia mengelola pendaftaran untuk penyedia pihak ketiga jika Anda ingin menggunakan yang menyediakan untuk memastikan permintaan yang masuk dikonfirmasi.
Apakah ada cara saya dapat menggunakan fungsionalitas baru di spring-security 5 untuk mendaftarkan penyedia OAuth untuk mendapatkan token untuk ditambahkan ke permintaan keluar dari aplikasi saya?
sumber
WebClient
), atau sesuatu yang serupa digunakan untuk mengambil token OAuth dari sebuah penyedia OAuth khusus (bukan yang mendukung OoTB seperti Facebook / Google) untuk menambahkannya ke permintaan keluar. Semua contoh tampaknya berfokus pada otentikasi permintaan masuk dengan penyedia lain. Apakah Anda punya petunjuk untuk contoh yang baik?WebClient
dengan jenis hibah kredensial klien.Jawaban di atas dari @Anar Sultanov membantu saya sampai di titik ini, tetapi karena saya harus menambahkan beberapa header tambahan ke permintaan token OAuth saya, saya pikir saya akan memberikan jawaban lengkap untuk bagaimana saya memecahkan masalah untuk kasus penggunaan saya.
Konfigurasikan detail penyedia
Tambahkan yang berikut ke
application.properties
Terapkan kebiasaan
ReactiveOAuth2AccessTokenResponseClient
Karena ini adalah komunikasi server-ke-server, kita perlu menggunakan
ServerOAuth2AuthorizedClientExchangeFilterFunction
. Ini hanya menerima aReactiveOAuth2AuthorizedClientManager
, bukan yang non-reaktifOAuth2AuthorizedClientManager
. Karena itu ketika kita menggunakanReactiveOAuth2AuthorizedClientManager.setAuthorizedClientProvider()
(untuk memberikannya kepada penyedia untuk digunakan untuk membuat permintaan OAuth2) kita harus memberikannyaReactiveOAuth2AuthorizedClientProvider
alih - alih non-reaktifOAuth2AuthorizedClientProvider
. Sesuai dengan dokumentasi pegas-keamanan jika Anda menggunakan non-reaktif,DefaultClientCredentialsTokenResponseClient
Anda dapat menggunakan.setRequestEntityConverter()
metode ini untuk mengubah permintaan token OAuth2, tetapi padanan reaktifWebClientReactiveClientCredentialsTokenResponseClient
tidak menyediakan fasilitas ini, jadi kami harus mengimplementasikan sendiri (kami dapat menggunakanWebClientReactiveClientCredentialsTokenResponseClient
logika yang ada ).Implementasi saya dipanggil
UaaWebClientReactiveClientCredentialsTokenResponseClient
(implementasi dihilangkan karena hanya sedikit mengubah metodeheaders()
danbody()
dari defaultWebClientReactiveClientCredentialsTokenResponseClient
untuk menambahkan beberapa header / bidang tambahan, itu tidak mengubah aliran auth yang mendasarinya).Konfigurasikan
WebClient
The
ServerOAuth2AuthorizedClientExchangeFilterFunction.setClientCredentialsTokenResponseClient()
Metode telah usang, sehingga mengikuti saran bantahan dari metode yang:Ini berakhir dengan konfigurasi yang terlihat seperti:
Gunakan
WebClient
seperti biasaThe
oAuth2WebClient
kacang sekarang siap untuk digunakan untuk mengakses sumber daya yang dilindungi oleh penyedia OAuth2 dikonfigurasi kami dalam cara Anda akan membuat permintaan lain menggunakanWebClient
.sumber
ClientRegistration
s dengan rincian yang diperlukan dan mengirimkannya ke konstruktor untukInMemoryReactiveClientRegistrationRepository
(implementasi defaultReactiveClientRegistrationRepository
). Anda kemudian menggunakanInMemoryReactiveClientRegistrationRepository
kacang yang baru dibuat itu sebagai pengganti autowired sayaclientRegistrationRepository
yang dimasukkan ke dalamoauthFilteredWebClient
metodeClientRegistration
saat runtime, kan? Sejauh yang saya mengerti saya perlu membuat kacangClientRegistration
saat startup.application.properties
file. Menerapkan sendiriReactiveOAuth2AccessTokenResponseClient
memungkinkan Anda untuk membuat permintaan apa pun yang Anda inginkan untuk mendapatkan token OAuth2, tapi saya tidak tahu bagaimana Anda bisa memberikan "konteks 'dinamis untuk setiap permintaan. Hal yang sama berlaku jika Anda menerapkan seluruh filter Anda sendiri. Semua ini akan memberi Anda akses ke permintaan keluar, jadi kecuali Anda dapat menyimpulkan apa yang Anda butuhkan dari sana, saya tidak yakin apa pilihan Anda. Apa kasus penggunaan Anda? Mengapa Anda tidak tahu kemungkinan pendaftaran saat startup?Saya menemukan @matt Williams menjawab cukup membantu. Meskipun saya ingin menambahkan seandainya seseorang ingin secara program melewati clientId dan rahasia untuk konfigurasi WebClient. Ini dia bagaimana bisa dilakukan.
sumber
Hai mungkin sudah terlambat namun RestTemplate masih didukung di Spring Security 5, untuk aplikasi non-reaktif RestTemplate masih digunakan yang harus Anda lakukan hanya mengkonfigurasi keamanan pegas dengan benar dan membuat interseptor seperti yang disebutkan pada panduan migrasi
Gunakan konfigurasi berikut untuk menggunakan aliran client_credentials
application.yml
Konfigurasi ke OauthResTemplate
Pencegat
Ini akan menghasilkan access_token dalam panggilan pertama dan kapan pun token itu kedaluwarsa. OAuth2AuthorizedClientManager akan mengelola semua ini untuk Anda
sumber