Kami mencoba menentukan cara terbaik untuk mengotorisasi pengguna dalam arsitektur layanan mikro, sambil memastikan layanan microser memiliki izin terbatas. Arsitektur kami menggunakan layanan otorisasi pusat untuk menangani penerbitan token JWT.
Kami memiliki persyaratan berikut:
Pengguna harus dibatasi untuk melakukan peran tertentu. misalnya pengguna hanya dapat membuat / memodifikasi / membaca konten yang dimilikinya.
Layanan Microsoft harus dibatasi hanya pada izin yang mereka butuhkan. mis. layanan mikro yang hanya perlu membaca data dari layanan lain harus secara eksplisit dilarang menulis data ke layanan itu.
Sebagai contoh, misalkan kita memiliki sistem di mana pengguna dapat mengunggah gambar ke layanan penyimpanan gambar. Kami memiliki layanan penandaan yang secara otomatis menandai gambar dengan lokasi. Pengguna hanya dapat CRUD gambar mereka sendiri. Layanan penandaan dapat membaca gambar apa pun dari layanan penyimpanan gambar, namun tidak dapat mengubah / menghapus.
Apa cara yang baik untuk mencapai hal di atas menggunakan token JWT? Beberapa solusi yang telah kita bahas adalah:
Layanan penyimpanan gambar memaparkan 2 API, yang tersedia secara eksternal (memberikan akses CRUD pengguna), dan yang tersedia secara internal (memberikan akses hanya baca internal). Tampak tidak fleksibel - bagaimana jika layanan internal lain memerlukan akses baca / tulis ke semua gambar (mis. Yang secara otomatis menghapus gambar eksplisit)?
Kami menyiapkan dua izin di JWT pengguna, satu menjadi CRUD_OwnImages, yang lainnya adalah READ_ForAnalysis. Layanan pemberian tag dapat melihat apakah pengguna memiliki izin READ_ForAnalysis, dan jika demikian, buat permintaan yang sesuai. Kami memiliki layanan microser lain yang memeriksa untuk melihat apakah pengguna memiliki CRUD_OwnImages untuk operasi CRUD pada gambar milik pengguna. Ini menempatkan tanggung jawab pada setiap layanan-mikro untuk memastikan bahwa pengguna dibatasi pada tindakan yang diperlukannya. Toko gambar tidak memiliki cara untuk membatasi setiap layanan Microsoft dengan pendekatan ini, sehingga berpotensi serpihan dan rentan kesalahan.
Kami memberikan layanan penandaan tag kepada penggunanya sendiri, dengan READ_ForAnalysis sebagai izin. Kemudian, ketika layanan pemberian tag meminta gambar dari penyimpanan gambar, ia diberikan akses ke gambar itu, tetapi dilarang memodifikasinya. Pengguna pengguna hanya memiliki izin CRUD_OwnImages, sehingga ia dapat mengambil dan mendapatkan akses ke hanya gambarnya dari frontend. Jika layanan lain membutuhkan CRUD untuk semua data, kami dapat memberikannya CRUD_AllData atau serupa. Kami menyukai pendekatan ini karena setiap layanan kini bertanggung jawab atas datanya sendiri (daripada logika yang diduplikasi di beberapa layanan), tetapi bagaimana jika layanan tersebut memerlukan izin pengguna dan izin layanan-mikro? Bisakah kita mengirim dua token JWT (baik pengguna dan layanan mikro) dengan aman? Apakah ada cara untuk menggabungkan izin secara aman dan mengirimkannya melalui? misalnya
Masalahnya diperburuk jika informasi pengguna diperlukan lebih jauh ke hilir (2 atau 3 layanan microser jauh). Apakah kita hanya berasumsi bahwa itu tergantung pada masing-masing layanan mikro untuk membatasi diri pada tindakan yang mereka butuhkan, dan tidak membuat itu eksplisit?