Masalah:
Kami memiliki RESTful API Spring MVC berbasis yang berisi informasi sensitif. API harus diamankan, namun mengirimkan kredensial pengguna (kombo / pengguna) dengan setiap permintaan tidak diinginkan. Per pedoman REST (dan persyaratan bisnis internal), server harus tetap tanpa kewarganegaraan. API akan dikonsumsi oleh server lain dengan pendekatan gaya mashup.
Persyaratan:
Klien membuat permintaan ke
.../authenticate
(URL yang tidak dilindungi) dengan kredensial; server mengembalikan token aman yang berisi informasi yang cukup bagi server untuk memvalidasi permintaan di masa mendatang dan tetap tanpa kewarganegaraan. Ini kemungkinan terdiri dari informasi yang sama dengan Remember-Me Token Spring Security .Klien membuat permintaan berikutnya ke berbagai URL (terlindungi), menambahkan token yang diperoleh sebelumnya sebagai parameter kueri (atau, yang kurang diinginkan, header permintaan HTTP).
Klien tidak dapat diharapkan untuk menyimpan cookie.
Karena kita sudah menggunakan Spring, solusinya harus menggunakan Spring Security.
Kami telah membenturkan kepala kami ke dinding mencoba membuat ini bekerja, jadi semoga seseorang di luar sana telah menyelesaikan masalah ini.
Dengan skenario di atas, bagaimana Anda bisa menyelesaikan kebutuhan khusus ini?
sumber
Jawaban:
Kami berhasil agar ini berfungsi persis seperti yang dijelaskan dalam OP, dan mudah-mudahan orang lain dapat memanfaatkan solusinya. Inilah yang kami lakukan:
Atur konteks keamanan seperti ini:
Seperti yang Anda lihat, kami telah membuat sebuah kebiasaan
AuthenticationEntryPoint
, yang pada dasarnya hanya mengembalikan a401 Unauthorized
jika permintaan tidak diautentikasi dalam rantai filter oleh kamiAuthenticationTokenProcessingFilter
.CustomAuthenticationEntryPoint :
AuthenticationTokenProcessingFilter :
Jelas,
TokenUtils
berisi beberapa kode rahasia (dan sangat khusus kasus) dan tidak dapat dibagikan dengan mudah. Inilah antarmuka-nya:Itu seharusnya membuat Anda memulai dengan baik. Selamat coding. :)
sumber
validate(...)
metodenya). Ini penting karena saya ingin server tetap stateless. Saya akan membayangkan Anda bisa menggunakan pendekatan ini tanpa harus menggunakan Spring.Anda mungkin mempertimbangkan Otentikasi Akses Intisari . Intinya protokol adalah sebagai berikut:
Semua komunikasi ini dilakukan melalui tajuk, yang, seperti ditunjukkan jmort253, umumnya lebih aman daripada mengomunikasikan materi sensitif dalam parameter url.
Otentikasi Akses Digest didukung oleh Spring Security . Perhatikan bahwa, meskipun dokumen mengatakan bahwa Anda harus memiliki akses ke kata sandi teks biasa klien Anda, Anda dapat berhasil mengotentikasi jika Anda memiliki hash HA1 untuk klien Anda.
sumber
Mengenai token yang membawa informasi, JSON Web Tokens ( http://jwt.io ) adalah teknologi yang brilian. Konsep utamanya adalah memasukkan elemen informasi (klaim) ke dalam token, dan kemudian menandatangani seluruh token sehingga akhir yang valid dapat memverifikasi bahwa klaim tersebut memang dapat dipercaya.
Saya menggunakan implementasi Java ini: https://bitbucket.org/b_c/jose4j/wiki/Home
Ada juga modul Spring (spring-security-jwt), tapi saya belum melihat apa yang didukungnya.
sumber
Mengapa Anda tidak mulai menggunakan OAuth dengan JSON WebTokens
http://projects.spring.io/spring-security-oauth/
OAuth2 adalah protokol / kerangka kerja otorisasi standar. Sesuai Spesifikasi Resmi OAuth2 :
Anda dapat menemukan info lebih lanjut di sini
sumber