Keamanan Aplikasi dengan Parse dan Back4app untuk Dev
Halo komunitas Back4app!
Ini adalah tutorial tamu dari Joren Winge di Startup Soul. Kami membantu startup membangun dan meluncurkan produk mereka dengan cepat. Teman-teman kami di Back4app meminta kami untuk menunjukkan kepada Anda cara membangun aplikasi yang aman di atas Back4app.
Dalam postingan ini, kami akan memandu Anda melalui langkah-langkah untuk membuat aplikasi To-Do yang aman di back4app. Keamanan itu penting. Jika aplikasi Anda berkembang, Anda perlu memastikan bahwa data aplikasi Anda aman dan bahwa sistem Anda tidak dapat diretas.
Mari kita bicarakan terlebih dahulu tentang tingkat keamanan pertama, ACL - (daftar kontrol akses). ACL pada dasarnya adalah aturan yang Anda tetapkan saat Anda membuat objek. Misalkan Anda membuat item to-do, pada saat pembuatan Anda dapat mengatakan siapa yang dapat membaca item tersebut, dan siapa yang dapat menulisnya. Anda dapat menetapkan pengguna tertentu untuk dapat membaca item tersebut atau menulis ke item tersebut atau Anda dapat mengatur salah satu dari keduanya ke publik yang memungkinkan akses kepada siapa saja. Namun, ACL tidak selalu berfungsi.
Ada kalanya Anda mungkin perlu memiliki logika yang lebih canggih daripada sekadar ACL sederhana. Terkadang Anda juga dapat terjebak di sudut di mana Anda mungkin perlu memberikan seseorang akses ke objek berdasarkan kondisi daripada berdasarkan absolut seperti dengan ACL. Jadi mari kita lewati penggunaan ACL. Mereka terlalu kaku dan pada saat yang sama memungkinkan terlalu banyak akses ke data. Jadi saya akan memberi Anda rahasia untuk membangun aplikasi yang aman di Back4App dan Parse Server. Anda siap?
Izin tingkat kelas! Ya, kami akan menetapkan izin tingkat kelas untuk setiap tabel di database kami. Dan tingkat izin yang akan kami tetapkan adalah tidak ada izin sama sekali. Kami akan mengunci setiap tabel sehingga tidak ada akses baca atau tulis yang diizinkan untuk siapa pun! Terdengar ekstrem, saya tahu, tetapi ini adalah langkah pertama dalam menciptakan aplikasi yang aman. Satu-satunya izin yang akan kami izinkan adalah pada tabel Pengguna yang akan digunakan untuk pembuatan objek pengguna baru dan untuk pengguna melihat data mereka sendiri yang diperlukan untuk menyegarkan pengguna saat ini.
Kami akan mengamankan pengguna agar tidak dapat melihat data pengguna lain dengan menggunakan ACL. Ini adalah satu-satunya kali kami akan menggunakan ACL, jadi saya rasa mereka tidak sepenuhnya tidak berguna. Mereka baik untuk dimiliki tetapi jangan bergantung pada mereka untuk melakukan segalanya. Tapi bagaimana kita akan mengakses data, Anda bertanya? Pertanyaan yang bagus, senang Anda memikirkannya! Nah, rahasia untuk membiarkan klien mengakses data dengan cara yang terkontrol adalah dengan membuat setiap interaksi antara klien dan database difilter melalui fungsi kode cloud. Ya, setiap kali Anda melakukan sesuatu dengan aplikasi Anda, itu sekarang akan melalui fungsi kode cloud kustom. Tidak ada lagi PFQueries berbasis klien.
Anda hampir tidak menggunakan seluruh Parse SDK berbasis klien kecuali untuk fungsi Daftar, fungsi Masuk, fungsi Lupa Kata Sandi, dan fungsi Keluar. Untuk ini, kami masih akan menggunakan SDK klien asli. Ini jauh lebih mudah. Apakah Anda pernah menulis kode cloud sebelumnya? Tidak, Anda bilang? Nah, itu cukup mudah. Ini hanya Javascript dan menggunakan Parse Javascript SDK tetapi secara internal di server aplikasi Anda sendiri. Faktanya, karena Parse Server berbasis Node JS, itu cukup mirip dengan menulis rute dengan Express, tetapi bahkan lebih mudah karena bahasa kueri Anda sudah terinstal dan fungsi kode cloud jauh lebih mudah ditulis daripada seluruh aplikasi Node JS Express.
Jadi inilah yang akan kami lakukan. Kami akan menggunakan aplikasi todo iOS yang sudah saya buat. Kami tidak akan repot-repot menunjukkan kepada Anda bagaimana saya membuatnya. Sebagai gantinya, kami akan fokus pada menulis kode cloud dan mengamankan database. Aplikasi todo akan menjadi aplikasi yang aman di mana Anda hanya dapat mengakses todo Anda sendiri dan Anda hanya dapat menulis todo Anda sendiri. Data akan aman di server dari klien jahat yang merugikan. Saya juga akan menunjukkan kepada Anda bagaimana menulis pekerjaan latar belakang Parse yang aman - pada dasarnya, hal yang sama seperti pekerjaan cron - sehingga Anda dapat memiliki layanan otomatis yang mengirim dan memanipulasi data Anda sesuai jadwal. Terdengar rumit tetapi tidak. Bayangkan robot server kecil yang melakukan apa pun yang Anda inginkan sesuai jadwal otomatis. Terdengar keren, kan? Oke, jadi mari kita mulai!!!!!!
1) Buat Aplikasi di Back4App:
- Buat aplikasi baru di Back4App. Sebut aplikasi tersebut ‘Aplikasi ToDo Aman’. * Catatan: Ikuti tutorial Aplikasi Parse Baru untuk belajar cara membuat aplikasi di Back4App. .
- Masuk ke halaman Pengaturan Inti aplikasi dan kemudian klik pada Edit Detail Aplikasi.
- Nonaktifkan kotak centang yang disebut ‘Izinkan Pembuatan Kelas Klien’ untuk menonaktifkan pembuatan kelas klien dan tekan simpan. Kami ingin membatasi apa yang dapat dilakukan klien sebagai aturan.
![Document image Document image](https://images.archbee.com/yD3zCY-NNBBIfd0uqcfR5/VNDlMYePW7A8bPrVK4-Yq_image.png?format=webp)
2) Atur izin keamanan tingkat kelas untuk kelas Pengguna:
- Selanjutnya kita akan mengatur izin untuk kelas User. Masuk ke dasbor database Back4App dan klik pada kelas User. Kemudian klik pada tab Keamanan, lalu klik pada ikon roda gigi di kanan atas. Anda akan melihat menu yang mengatakan Sederhana/Advanced. Alihkan penggeser ke Advanced. Anda kemudian akan melihat izin tingkat kelas lengkap untuk kelas ini. Nonaktifkan kotak centang Temukan. Nonaktifkan kotak centang Perbarui dan Hapus. Terakhir, nonaktifkan kotak centang Tambah Kolom. Kemudian tekan simpan. Pengaturan Keamanan Anda harus terlihat seperti ini.
![Document image Document image](https://images.archbee.com/yD3zCY-NNBBIfd0uqcfR5/FCpGNNzSvdsRQ8xJ1a_-G_image.png?format=webp)
3) Buat kelas ToDo:
- Tekan Buat kelas dan beri nama ToDo. Atur jenis kelas sebagai kustom.
![Document image Document image](https://images.archbee.com/yD3zCY-NNBBIfd0uqcfR5/eU61hrjMThuTLTBivShRg_image.png?format=webp)
4) Atur izin keamanan tingkat kelas untuk kelas ToDo:
- Selanjutnya kita akan mengatur izin untuk kelas ToDo. Masuk ke dasbor database Back4App dan klik pada kelas ToDo. Kemudian klik pada tab Keamanan, lalu klik pada ikon roda gigi di kanan atas. Anda akan melihat menu yang mengatakan Sederhana/Advanced. Alihkan penggeser ke Advanced. Anda kemudian akan melihat izin tingkat kelas lengkap untuk kelas ini. Nonaktifkan semuanya lalu tekan simpan. Pengaturan Keamanan Anda harus terlihat seperti ini.
![Document image Document image](https://images.archbee.com/yD3zCY-NNBBIfd0uqcfR5/DhWsbHPtTx_UEDJxuCyht_image.png?format=webp)
5) Mari kita tambahkan beberapa kolom ke kelas ToDo:
- Pertama, mari kita gabungkan kelas ToDo dengan kelas User. Kita akan melakukannya dengan menambahkan 2 kolom.
- Kolom pertama akan disebut ‘user’ dan akan menjadi pointer kembali ke kelas user.
- Selanjutnya, mari kita buat kolom untuk id objek pengguna yang membuatnya. Ini akan menjadi tipe string dan akan disebut ‘userObjectId’.
- Selanjutnya, mari kita buat kolom untuk menyimpan informasi todo kita yang sebenarnya. Ini juga akan menjadi string dan akan disebut ‘todoDescription’.
- Mari kita buat Boolean untuk menyimpan status todo. Mari kita sebut ‘finished’.
- Akhirnya, mari kita tambahkan satu kolom lagi untuk menyimpan tanggal Anda menyelesaikan todo Anda. Mari kita sebut ‘finishedDate’ dan atur ke tipe tanggal.
- Kelas ToDo Anda harus terlihat seperti ini
![Document image Document image](https://images.archbee.com/yD3zCY-NNBBIfd0uqcfR5/IPxsB-USsmjzrX1ySC2WW_image.png?format=webp)
6) Mari kita bahas klien:
Klien adalah aplikasi todo yang cukup dasar. Ini menggunakan fungsi parse bawaan untuk login, membuat pengguna baru, dan mengatur ulang kata sandi Anda. Selain itu, semuanya berbasis kode cloud dan aman. ACL pengguna juga diatur segera setelah mereka login atau mendaftar hanya untuk memastikan 100% bahwa sistem aman. Mari kita mulai dengan menulis fungsi kode cloud untuk mengatur ACL pengguna saat login atau mendaftar.
Kapan saja, Anda dapat mengakses proyek iOS lengkap yang dibangun dengan tutorial ini di repositori GitHub.
Anda juga dapat mengakses file kode cloud Main.js yang dibangun untuk tutorial ini di repositori GitHub.

- 1 . Di klien, buka ToDoController.swift dan cari fungsi setUsersAclsNow. Fungsi ini dipanggil saat Anda login atau melihat LoggedInViewController.swift. Fungsi ini memeriksa apakah Anda sudah login dan jika iya, ia memanggil fungsi cloud untuk mengatur ACL pengguna pribadi Anda.

- 2 . Sekarang mari kita tulis fungsi kode cloud
- 3 . Kode cloud ini menggunakan dua fitur kunci untuk membuat aplikasi Anda aman, request.user dan masterKey. Request.user memungkinkan Anda mengakses pengguna yang melakukan panggilan kode cloud dan memungkinkan Anda membatasi akses untuk pengguna tersebut. Dalam hal ini, kami menggunakannya untuk mengatur acl pengguna agar membatasi akses baca hanya untuk pengguna saat ini. Dengan cara ini hanya pengguna yang dapat membaca informasi mereka sendiri. Izin tingkat kelas mencegah akses tulis bahkan untuk pengguna saat ini. Dengan cara ini pengguna tidak dapat mengubah informasi mereka sendiri. Mereka hanya dapat mengubah hal-hal tentang pengguna mereka sendiri melalui kode cloud. Memungkinkan untuk mengimpor informasi palsu saat pengguna pertama kali mendaftar, tetapi saya akan merekomendasikan menulis fungsi kode cloud untuk memeriksa informasi pengguna setelah pengguna baru dibuat. Fungsi parse bawaan untuk membuat pengguna baru sangat membantu sehingga saya pikir itu adalah kompromi yang layak, tetapi Anda selalu dapat mengatur nilai default untuk pengguna melalui kode cloud segera setelah mereka mendaftar. Ada banyak pengaman yang juga dapat Anda tulis ke dalam kode cloud dan menjalankannya secara otomatis dan terus-menerus menggunakan pekerjaan latar belakang untuk mendeteksi informasi pengguna jahat yang diimpor saat pengguna pertama kali dibuat. Jika Anda ingin benar-benar aman, Anda dapat menyimpan informasi sensitif seperti status keanggotaan atau informasi pembayaran di tabel terpisah dari tabel pengguna. Dengan cara itu pengguna tidak dapat memalsukan informasi sensitif saat pembuatan pengguna.

- 4. Selanjutnya, mari kita lihat cara membuat ToDo. Di klien, buka ToDoController.swift dan cari fungsi saveToDo. Fungsi ini dipanggil saat Anda membuat todo baru. Fungsi ini mengambil string yang menggambarkan todo dan menyimpannya di database.
- 5. Sekarang mari kita tulis fungsi kode cloud untuk menyimpan todo di database

- 6 . Fungsi kode cloud ini membuat objek todo dan menetapkan pengguna saat ini sebagai pemilik objek. Ini penting agar hanya pengguna yang membuatnya yang dapat menemukannya atau memodifikasinya. Dengan tidak mengizinkan todo dibuat di klien, kami memaksa objek todo untuk mematuhi standar kami dan memastikan todo dimiliki oleh pengguna yang membuatnya.
- 7 . Selanjutnya, mari kita lihat cara mengambil todos yang Anda buat dari server. Di klien, buka ToDoController.swift dan cari fungsi getToDosForDate. Fungsi ini dipanggil saat Anda mengambil todos Anda. Fungsi ini mengambil tanggal sebagai parameter dan menggunakannya untuk mengambil daftar todos yang dibuat oleh Anda sebelum tanggal tersebut dalam urutan menurun. Menggunakan tanggal adalah cara yang bagus untuk menulis kueri pemuatan malas yang tidak menggunakan skip. Skip kadang-kadang dapat gagal pada dataset yang besar.

- 8 . Sekarang mari kita tulis fungsi kode cloud untuk mengambil todos dari database berdasarkan tanggal mulai. Kami melakukan kueri untuk todos yang dibuat sebelum tanggal parameter sehingga kami menggunakan ‘query.lessThan’ karena tanggal pada dasarnya adalah angka yang semakin besar seiring dengan waktu yang lebih jauh ke depan. Saya juga menyertakan beberapa kode yang rumit di sini. Katakanlah kami menyertakan objek pengguna yang membuat todo tetapi kami tidak ingin membagikan informasi sensitif tentang pengguna tersebut kepada pengguna lain, kami perlu menghapusnya dari respons json. Jadi kami memiliki loop for di mana kami mengambil objek pengguna dari todo, menghapus email dan nama pengguna dari json dan kemudian memasukkannya kembali ke dalam todo. Ini berguna untuk menghapus data sensitif dari panggilan api dalam situasi di mana Anda tidak dapat mengontrol bidang apa yang Anda kembalikan - seperti objek pengguna yang disertakan. Dalam hal ini, kami sebenarnya tidak membutuhkannya karena fungsi ini hanya akan mengembalikan todos yang Anda buat sendiri. Kami melakukan ini dengan menggunakan CurrentUser lagi untuk melakukan kueri hanya untuk todos yang dibuat oleh CurrentUser yang terlampir pada permintaan. Hasilnya dikembalikan dalam urutan menurun sehingga todos terbaru muncul pertama. Ketika Anda perlu memuat batch todos lain secara malas, Anda mengambil tanggal createdAt dari todo terakhir dan menggunakannya sebagai parameter tanggal untuk permintaan berikutnya.
- 9 . Sekarang kita memiliki todos, kita bisa melihatnya di aplikasi dan menandainya sebagai selesai jika kita mau. Mari kita bahas itu selanjutnya.

- 10 . Untuk menandai todo sebagai selesai, cukup tekan tombol ‘Tandai Sebagai Selesai’ pada salah satu todo yang Anda buat. Ini akan memicu metode di ToDoController.swift yang disebut ‘markToDosAsCompletedFor’ yang mengambil todo yang Anda pilih sebagai parameter. Ini mengirimkan todo.objectId ke server sebagai parameter dan kemudian mengembalikan todo yang diperbarui sebagai hasil.

- 11. Sekarang kita akan menulis kode cloud untuk memperbarui todo ini. Ini mencari todo untuk diperbarui berdasarkan objectId tetapi juga menggunakan CurrentUser untuk memastikan bahwa todo yang terkait dengan objectId dibuat oleh pengguna yang melakukan kueri. Ini memastikan bahwa Anda hanya dapat melihat todo yang Anda buat dan dengan demikian aman. Kami menyertakan batas 1 hasil untuk memastikan server tidak terus mencari setelah menemukan todo. Ada metode lain untuk menemukan objek berdasarkan objectId tetapi saya tidak suka menggunakannya karena dapat mengembalikan hasil yang aneh jika tidak menemukan objek yang terkait dengan objectId. Kami juga mengatur 'finishedDate' dengan tanggal saat ini ketika objek diperbarui. Dengan hanya mengatur finishedDate oleh fungsi ini, kami telah memastikan bahwa finishedDate aman dan tidak dapat dipalsukan atau diubah. Kami juga menggunakan 'query.equalTo(
7) Selesai!
- Dan itu saja. Anda telah membangun aplikasi todo yang aman. Sekali lagi, kunci untuk membuat aplikasi yang aman di server parse adalah menonaktifkan semua izin tingkat kelas untuk semua kelas kecuali kelas Pengguna. Di kelas Pengguna, Anda menonaktifkan semua izin kecuali CREATE, dan GET. Juga pastikan untuk mengatur semua ACL pengguna sehingga pengguna hanya dapat GET data mereka sendiri. Kemudian semua interaksi Anda melalui kode cloud dan difilter menggunakan request.user alias CurrentUser. Jadi, itu dia, Anda sekarang dapat membangun sistem yang aman di atas server Parse dan Back4App. Tapi tunggu, Anda bilang? Bagaimana dengan Pekerjaan Latar Belakang dan Kuery Langsung. Nah, Anda memiliki poin yang baik, jadi saya akan membahasnya dalam dua bagian bonus berikutnya.

8) Bagian Bonus
- 1 . Pekerjaan latar belakang - terkadang Anda perlu membuat pekerjaan latar belakang untuk dijalankan setiap jam, atau setiap hari atau setiap minggu. Jika Anda menjalankan dengan semua izin tingkat kelas dimatikan, pekerjaan latar belakang Anda tidak akan dapat mengquery database kecuali jika diatur dengan benar. Ini agak rumit untuk dilakukan jadi saya ingin menyertakan contoh di sini. Dalam hal ini kita akan membuat pekerjaan latar belakang yang memeriksa database untuk todo yang belum selesai yang berumur lebih dari 1 tahun dan kemudian secara otomatis menandainya sebagai selesai. Trik di sini adalah menggunakan ‘useMasterKey’ dengan benar. Ini harus ditambahkan ke query sebelum janji .then. Cukup ikuti template ini dan Anda seharusnya dapat menulis pekerjaan latar belakang yang aman dengan mudah. Anda selalu mulai dengan menulis query yang ingin Anda iterasi di seluruh database dan kemudian pastikan untuk menyertakan status.error jika ada kesalahan dan mengakhirinya dengan status.success untuk memastikan itu selesai. Anda dapat melihat log di Back4App untuk melihat pekerjaan latar belakang berfungsi saat Anda menjalankannya.

- 2 . Kuery Langsung - terkadang Anda perlu menggunakan fitur Kuery Langsung Parse untuk sesuatu seperti aplikasi obrolan langsung. Anda akan ingin menggunakan kuery langsung untuk melihat kapan pesan baru untuk pengguna Anda dibuat. Kuery Langsung pada dasarnya adalah cara Parse menggunakan soket untuk mendapatkan pembaruan langsung. Ini cukup berguna tetapi tidak akan berfungsi dengan kelas yang izin FIND-nya telah dimatikan. Jadi dalam hal ini kita akan menghidupkan kembali izin FIND untuk kelas Pesan dan sebaliknya kita akan menetapkan ACL untuk pesan itu secara langsung. ACL harus diatur sehingga hanya penerima yang dapat menggunakan FIND untuk mendapatkan pesan dari server. Kemudian Anda menjalankan PF Live Query di klien Anda mencari pesan untuk pengguna Anda dan itu akan berfungsi dengan sempurna. Jika Anda berurusan dengan pesan grup, itu sedikit berbeda. Anda dapat menetapkan beberapa orang untuk berada di ACL tetapi, itu benar-benar tidak skala. Sebagai gantinya, ada cara yang lebih baik. Anda mengatur ACL berdasarkan Peran - Parse.Role - dan kemudian pengguna mana pun yang ingin Anda beri akses ke pesan itu, Anda cukup menetapkan mereka ke Parse.Role itu. Jika Anda ingin menghentikan mereka dari membaca pesan untuk grup itu, Anda menghapus mereka dari peran itu. Ini jauh lebih mudah daripada menghapus mereka dari ACL setiap pesan dan ini dapat diskalakan untuk grup yang sangat besar. Ini adalah cara yang benar untuk melakukannya. Saya tidak akan meninggalkan contoh kode untuk ini karena terlalu kompleks untuk tutorial ini, tetapi mungkin saya akan menjelaskan cara melakukannya di tutorial saya berikutnya. Terima kasih telah membaca tutorial ini tentang keamanan dengan Parse dan Back4App. Jika Anda memiliki pertanyaan, silakan hubungi saya dan saya akan senang untuk menjawabnya.
Terima kasih! Joren