Saya sedang dalam proses mendesain 3 komponen yang akan bekerja secara simfoni satu sama lain:
- Sebuah layanan web yang tenang yang membutuhkan
BasicAuth
lebih dari HTTPS pada semua panggilan, dan yang merupakan apa sebenarnya yang mengangkat semua berat untuk sistem saya (melakukan pekerjaan) - UI web yang menerjemahkan tindakan pengguna akhir menjadi panggilan API ke layanan web yang disebutkan di atas; karenanya UI "didukung oleh" WS
- Alat antarmuka baris perintah (CLI) yang dapat diinstal dan dijalankan oleh pengembang secara lokal, yang juga menerjemahkan perintah ke dalam panggilan API ke WS (karenanya juga "didukung oleh" WS)
Salah satu rintangan pertama yang saya coba lewati adalah sehubungan dengan otentikasi dan otorisasi.
Mari kita berpura-pura bahwa WS menggunakan layanan direktori LDAP (seperti AD atau mungkin Apache DS) sebagai ranah otentikasi. Berarti, ketika panggilan API masuk atas kawat (katakanlah, HTTPS GET
untuk beberapa sumber daya), BasicAuth
kredensial diambil dari permintaan, dan diteruskan ke layanan LDAP untuk menentukan apakah ini adalah pengguna yang valid atau tidak. Jika mereka diautentikasi, maka katakanlah bahwa ranah otorisasi yang terpisah, mungkin basis data, digunakan untuk menentukan apakah pengguna yang diidentifikasi dapat melakukan apa yang mereka coba dalam permintaan HTTPS. Sejauh ini bagus.
Dalam hal alat CLI, pengguna harus mengautentikasi sebelum menjalankan perintah apa pun, dan model ini berfungsi dengan baik, karena satu pengguna hanya akan mengoperasikan instance CLI yang sama pada waktu tertentu.
Masalahnya muncul ketika kami mencoba mengintegrasikan aplikasi web (UI) dengan WS, karena banyak orang dapat masuk ke aplikasi pada saat yang sama, semua dengan izin berbeda yang menentukan panggilan API yang mendasari yang mereka boleh buat.
Sejauh yang saya lihat, sepertinya saya hanya memiliki 4 pilihan di sini:
- Kredensial Tembolok : Setelah masuk ke aplikasi, kredensial entah bagaimana, di suatu tempat di- cache (sedemikian rupa sehingga aplikasi memiliki akses ke sana), dan aplikasi itu tidak memberlakukan segala jenis kebijakan otorisasi itu sendiri. Saat pengguna mencoba melakukan hal-hal yang menghasilkan panggilan API di bawah tenda, kredensial mereka akan dicari dari cache, dan diteruskan dengan panggilan API. Jika WS menentukan bahwa mereka tidak diotorisasi, WS mengirim kembali kesalahan.
- Akun Tingkat Layanan : Aplikasi dan WS keduanya menggunakan bidang otentikasi / otorisasi yang sama, kecuali UI web sekarang memberlakukan otorisasi pada apa yang sebenarnya dapat dilihat dan dilakukan pengguna di dalam aplikasi. Jika mereka diizinkan untuk melakukan sesuatu yang menghasilkan panggilan API yang mendasarinya, aplikasi mengirimkan kredensial akun layanan (misalnya
myapp-admin-user
) dengan setiap panggilan API atas nama pengguna. - OAuthv2 : Saya tidak tahu apa itu OAuth atau apakah ini berlaku untuk skenario ini, tetapi saya rasa itu bisa menjadi solusi di sini entah bagaimana.
- Server Token : Gunakan server token seperti CAS atau mungkin Kerberos untuk menjamin pengguna, dengan cara yang sama seperti berperilaku opsi Akun Tingkat Layanan. Di sini, ketika pengguna berhasil masuk ke aplikasi, server token mengirim kembali aplikasi ke UUID sesi, dan juga mendaftarkan UUID itu ke WS. Setiap kali aplikasi menghasilkan panggilan API, ia akan mengaktifkan UUID sesuai permintaan, yang kemudian divalidasi di sisi WS.
Opsi " Cached Credentials " hanya terasa seperti penyimpangan dari segala sesuatu yang baik dan sehat di tanah keamanan. Rasanya salah untuk cache kredensial di mana saja, pernah.
Opsi " Token Server " tampaknya valid untuk pengaturan jenis SSO, tetapi tidak dalam kasus khusus ini dan terasa aneh bagi saya. Saya juga berpikir tidak ada cara yang baik untuk menggunakan konsep dan BasicAuth
/ HTTPS sesi sesi pada saat yang sama.
Jadi ini meninggalkan OAuthv2, yang tidak saya ketahui, dan " Service-Level Account (SLA) * " sebagai satu-satunya pilihan yang tersisa. Opsi SLA tampaknya OK, tetapi memiliki beberapa kelemahan berikut:
- Ini membutuhkan akun layanan untuk dasarnya memiliki "hak istimewa dewa" atas WS. Dengan kata lain, setelah aplikasi menganggap pengguna diizinkan untuk mengklik tombol atau melakukan sesuatu di UI, yang diterjemahkan menjadi panggilan API tanpa syarat oleh akun layanan yang digunakan oleh UI. Ini terasa buruk, mkay?
- Terjadi pada saya bahwa mempertahankan dua set izin (set izin untuk setiap pengguna aplikasi, dan kemudian set izin untuk akun layanan yang digunakan oleh aplikasi terhadap WS) dapat mengakibatkan izin keluar dari selaras satu sama lain entah bagaimana
Jadi sepertinya saya tidak punya pilihan bagus di sini. Tentunya saya tidak bisa menjadi pengembang pertama yang mengalami hal ini, tetapi meminta Google Dewa tidak banyak membantu saya di sini. Ada ide?