Latar Belakang:
Saat ini sedang dalam proses membangun REST API, menggunakan simpul dengan express dan dikonsumsi oleh aplikasi seluler dan akhirnya situs web (berbasis browser modern).
Saya mencoba mengidentifikasi cara terbaik untuk mengotorisasi pembaruan / permintaan tindakan pengguna sehingga mereka hanya diizinkan untuk memodifikasi sumber daya mereka sendiri. Tindakan akan terjadi pada tingkat semi tinggi karenanya menjadi perhatian.
Catatan: Kepemilikan entitas tidak dapat ditransfer dalam kasus penggunaan ini.
Solusi Potensial:
Solusi : Simpan dan simpan daftar sumber daya setiap pengguna dalam sesi server yang didukung oleh sesuatu seperti reddis.
Masalah : Bertahan pada sesi sisi server memiliki kerumitannya sendiri, khususnya penskalaan dengan beberapa server. Ini juga melanggar REST. do-session-really-violate-restfulness untuk informasi lebih lanjut.
Solusi: Lakukan kueri baca sebelum kueri / tindakan pengguna. Yaitu memberi saya item pengguna ini maka jika dalam daftar melanjutkan dengan pembaruan.
Kekhawatiran: Overhead dari bacaan tambahan setiap kali pengguna bertindak atas nama sumber daya.
Solusi: Lewatkan id pengguna ke lapisan db dan menjadikannya bagian dari pembaruan bersyarat atau jika Anda ingin menggunakan sesuatu seperti keamanan tingkat baris Postgres untuk sumber daya itu tergantung pada backend data.
Kekhawatiran: Ini agak terlambat dalam siklus hidup permintaan untuk memeriksa apakah sumber daya adalah pengguna yang meminta. Kesalahan harus dibuang jauh-jauh dari backend data. Pada catatan yang sama itu juga akan sedikit keluar dari tempat mengingat otentikasi dan otorisasi berbasis peran sering dilakukan pada awal siklus hidup permintaan. Implementasinya juga tergantung pada backend data. Ini juga mendorong logika bisnis di backend data.
Solusi: Sesi ditandatangani pihak klien. Baik dengan JWT atau cookie terenkripsi / ditandatangani. Pada dasarnya mempertahankan sesi tepercaya yang berisi daftar id sumber daya pengguna.
Kekhawatiran: Ukuran sesi sisi klien. Fakta bahwa itu akan dikirim dengan setiap permintaan bahkan ketika itu tidak diperlukan. Pemeliharaan menjadi sangat kompleks ketika Anda memperkenalkan kemungkinan beberapa sesi / klien aktif. Bagaimana Anda memperbarui status sisi klien ketika sumber daya ditambahkan pada klien lain.
Solusi: Berikan token pembaruan yang ditandatangani (JWT) atau url ke klien dengan sumber daya saat sumber diambil. Harapkan bahwa ketika sumber daya diperbarui / ditindaklanjuti. Token yang ditandatangani akan berisi id pengguna dan id sumber daya dan Anda dapat memverifikasi dengan mudah terhadap itu.
Kekhawatiran: Mendapat kompleksitas jika kepemilikan sumber daya dapat ditransfer tetapi dalam kasus saya itu bukan masalah. Memperkenalkan kompleksitas pada pembacaan sebelum pembaruan. Agak aneh?
Pikiran terakhir:
Saya condong ke solusi terakhir, tetapi karena saya tidak melihat itu terjadi sangat sering saya bertanya-tanya apakah saya kehilangan sesuatu? atau mungkin itu bagian dari pola desain yang tidak saya ketahui.