‫Instruktur: Jadi dalam
‫kuliah ini, kita akan mengelola kata sandi pengguna kita di database.
‫Dan maksud saya untuk memvalidasi terlebih
‫dahulu jika kata sandi yang dimasukkan sama dengan kata sandi
‫yang dikonfirmasi dan kemudian juga mengenkripsi kata sandi dalam
‫database untuk mengamankannya dari serangan.
‫Dan hal pertama yang akan
‫kita lakukan adalah memvalidasi apakah kedua kata sandi yang dimasukkan sama.
‫Dan tempat terbaik untuk melakukannya
‫adalah di sini di konfirmasi kata sandi, oke?
‫Jadi mari kita tulis validator khusus kita untuk itu, oke?
‫Jadi ingat, kita menggunakan properti validasi dan kemudian karena
‫kita ingin membuat fungsi dan
‫juga pesan kesalahan, mari kita buka objek baru di sini dan
‫kemudian di sana buat validator, yang
‫akan menjadi fungsi dan
‫mari kita mulai dengan yang ini.
‫Jadi, ingat, yang kita butuhkan di sini
‫adalah menentukan fungsi panggilan balik sederhana yang kemudian akan
‫dipanggil saat dokumen baru dibuat.
‫Jadi, fungsi,
‫dan sekali lagi, kita tidak dapat menggunakan fungsi panah
‫karena kita sebenarnya perlu menggunakan kata kunci disk.
‫Oke?
‫Jadi, ingat bahwa dari fungsi validator kita
‫mengembalikan true atau false
‫dan jika nilai yang dikembalikan salah,
‫maka itu berarti kita akan mendapatkan kesalahan validasi, oke?
‫Dan, tentu saja, jika itu benar, maka tidak.
‫Dan yang kami inginkan di sini adalah untuk mengatakan bahwa elemen saat
‫ini jadi, konfirmasi kata sandi, sama dengan kata sandi titik ini,
‫jadi, konfirmasi kata sandi, sama dengan kata sandi titik
‫ini, dan hanya itu!
‫Jadi, misalnya, jika konfirmasi kata sandi adalah A-B-C, dan
‫kata sandi juga A-B-C, maka ini
‫tentu saja akan mengembalikan benar, oke?
‫Dan kemudian validasi dilewatkan
‫dan tidak akan terjadi kesalahan.
‫Tapi, jika kata sandi awal adalah, katakanlah, X-Y-Z, maka tentu
‫saja ini akan mengembalikan false
‫dan kita akan memiliki kesalahan validasi, oke?
‫Jadi, sangat sederhana, tapi kita perlu
‫ingat bahwa ini hanya akan berhasil di save, oke?
‫Jadi saya membicarakannya
‫sebelumnya ketika kami menggunakan validator khusus pada model tur, bukan?
‫Tapi saya mengingatkan Anda
‫tentang itu di sini lagi karena ini sangat penting di sini, oke?
‫Jadi izinkan saya benar-benar menuliskannya di sini untuk Anda.
‫(mengklik keyboard) Saat
‫disimpan.
‫Oke?
‫Dan untuk alasan ini, setiap kali kami ingin memperbarui
‫pengguna, kami harus selalu menggunakan simpan juga
‫dan tidak, misalnya, menemukannya dan memperbarui seperti yang
‫kami lakukan dengan tur kami, oke?
‫Jadi mari kita ingat
‫ini ketika kita menulis sisa kode di
‫seluruh bagian dan terutama untuk memperbarui, oke?
‫Karena misalkan kita mengupdate password pengguna
‫hanya dengan update biasa.
‫Maka dalam hal ini, kata sandi konfirmasi validasi
‫yang kita miliki di sini tidak akan berfungsi lagi, oke?
‫Dan tentu saja itu tidak boleh terjadi, oke?
‫Jadi, sekali lagi, perlu diingat bahwa ini hanya akan
‫berfungsi ketika kita membuat objek baru, seterusnya dot create, atau save.
‫Oke?
‫Jadi, saat membuat dan
‫menyimpan, Jadi, saat membuat dan menyimpan,
‫oke?
‫Jadi kita membuat objek baru menggunakan create, kan?
‫Jadi, di sini, menggunakan dot create Jadi, di
‫sini, menggunakan dot create tapi
‫ingat bagaimana saya
‫juga menunjukkan kepada Anda bahwa kita dapat menggunakan
‫pengguna dot save, seperti ini, kan?
‫Dan sebenarnya, kita juga bisa menggunakan pengguna
‫dot save untuk memperbarui pengguna, oke?
‫Tetapi sekali lagi, lebih banyak tentang itu nanti.
‫Oke?
‫Jadi sekarang mari kita coba validasi ini di sini, oke?
‫Jadi pertama-tama, mari kita coba membuat
‫pengguna baru dengan data ini
‫di sini yang seharusnya tidak berfungsi karena
‫kami sudah memiliki pengguna dengan alamat email ini dan kami
‫mengatakan bahwa yang ini harus unik dan
‫seharusnya tidak berfungsi.
‫Oke, dan tentu saja kesalahan kunci duplikat kami, bukan?
‫Sekarang jika Anda sedang dalam produksi,
‫maka tentu saja kita sudah akan mendapatkan kesalahan yang diformat
‫dengan baik yang kita buat di bagian terakhir, bukan?
‫Tetapi saat ini kami sedang dalam pengembangan dan itulah kesalahan yang kami definisikan
‫yang ingin kami lihat.
‫Oke?
‫Jadi mari kita gunakan email lain di sini
‫dan karena kita sedang mengerjakan email
‫di sini, mari kita lihat juga cara kerja validasi alamat email.
‫Jadi katakanlah kami menetapkan ini sebagai email kami.
‫Jadi, kami melihat kesalahan, "harap berikan email yang valid. " Oke?
‫Jadi mari kita uji seperti ini karena menurut
‫saya ini juga tidak valid.
‫Mungkin iya, tapi mari kita lihat.
‫Dan ya, sebenarnya bukan karena
‫tidak ada nama domain yang hanya memiliki satu huruf, oke?
‫Jadi validator ini cukup spesifik
‫sehingga sangat bagus.
‫Sekarang jika kita melakukannya seperti ini, maka tentu saja itu harus berhasil.
‫Tapi bagaimanapun, yang ingin kami uji
‫di sini adalah kata sandi yang berbeda ini, oke?
‫Dan saya ingat sekarang
‫bahwa kami sebenarnya tidak membuat pesan kesalahan, saya percaya.
‫Dan ya, kami tidak melakukannya.
‫Jadi, mari tambahkan itu di sini juga.
‫Jadi pesan, tidak sama.
‫Oke.
‫Jadi mari kita tambahkan sesuatu di sini, tidak masalah.
‫Jadi sekarang, kata sandi tidak sama, oke?
‫Begitu sempurna.
‫Dan sekarang tentu saja validasi kita harus lolos.
‫Dan memang, itu dan kami membuat pengguna baru kami.
‫Mari menuju ke Kompas di
‫sini, lihat, dan kemudian benar-benar menghapusnya sehingga
‫nanti saya dapat membuat lebih banyak pengguna dengan email yang sama.
‫Baiklah?
‫Dan kami tidak ingin semua sampah ini
‫ada di sini, jadi semua pengguna uji ini, oke?
‫Tapi sekarang, langkah selanjutnya adalah mengenkripsi password
‫biasa yang kita simpan di
‫database kita sekarang.
‫Jadi, seperti yang saya sebutkan di
‫video terakhir, ketika kita
‫bekerja dengan otentikasi, salah satu prinsip
‫paling mendasar adalah jangan pernah menyimpan kata sandi biasa dalam database, oke?
‫Jadi itu adalah sesuatu yang sama sekali tidak dapat diterima, oke?
‫Jadi kita harus benar-benar selalu mengenkripsi kata sandi pengguna karena
‫bayangkan untuk beberapa alasan,
‫seorang peretas mendapatkan akses ke basis data.
‫Jika kemudian kata sandi disimpan dalam teks biasa di sana, maka
‫dia cukup masuk sebagai pengguna mana pun dan
‫kemudian melakukan apa pun yang dia
‫inginkan dan menyebabkan banyak kerusakan dalam beberapa kasus, oke?
‫Jadi kita harus benar-benar mencegahnya.
‫Jadi sekarang mari kita lanjutkan dan terapkan ini.
‫Sekarang, di mana tempat terbaik untuk benar-benar melakukan itu?
‫Yah, saya berpendapat bahwa model selalu merupakan tempat
‫terbaik untuk melakukan fungsi semacam ini.
‫Jadi dalam hal ini, enkripsi
‫karena itu benar-benar ada hubungannya dengan data itu
‫sendiri dan itu harus
‫di model dan bukan di controller, oke?
‫Jadi sekali lagi, ingatlah model gemuk, filosofi
‫pengontrol tipis di sini.
‫Baiklah?
‫Jadi bagaimana kita sekarang akan menerapkan enkripsi ini?
‫Nah, ini adalah kasus penggunaan sempurna
‫lainnya untuk menggunakan middleware Mongoose.
‫Dan salah satu yang
‫akan kita gunakan adalah pre-save middleware.
‫Jadi pada dasarnya mendokumentasikan middleware, oke?
‫Jadi, ingat bahwa kita mendefinisikannya di skema, oke?
‫Dan dalam hal ini, kami
‫ingin mengatur pre-hook, jadi pre-middleware disimpan, oke?
‫jadi pra-middleware di save, oke?
‫Dan alasan mengapa kami melakukannya
‫seperti ini adalah
‫karena fungsi middleware yang akan kami tentukan
‫di sini, jadi enkripsi, akan terjadi
‫antara saat kami menerima data tersebut
‫dan saat data tersebut disimpan ke basis data, oke?
‫Jadi di situlah middleware pra-simpan berjalan.
‫Antara mendapatkan data dan menyimpannya ke database.
‫Dan itulah saat yang tepat untuk memanipulasi data.
‫Baiklah?
‫Jadi,
‫sebuah fungsi, dan kemudian ingat kita memiliki
‫akses ke fungsi berikutnya untuk memanggil middleware berikutnya.
‫Oke, sekarang kita sebenarnya hanya ingin mengenkripsi
‫kata sandi jika kolom kata sandi benar-benar telah diperbarui, oke?
‫Jadi pada dasarnya hanya ketika benar-benar kata sandi diubah
‫atau juga ketika dibuat baru, oke?
‫Karena bayangkan pengguna hanya memperbarui email.
‫Kemudian dalam hal
‫ini, tentu kita tidak ingin mengenkripsi password lagi, bukan?
‫Jadi kita bisa melakukannya dengan Mongoose.
‫Jadi kita akan mengatakan, jika dan kemudian ini, yang
‫mengacu pada dokumen saat ini, kan?
‫Dan dalam hal ini, untuk pengguna saat
‫ini dan kemudian dimodifikasi.
‫Oke?
‫Jadi kami memiliki metode pada semua dokumen yang dapat
‫kami gunakan jika bidang tertentu telah dimodifikasi.
‫Dan di sini, kita harus memasukkan nama bidang, jadi
‫"kata sandi. " Oke?
‫Jadi pada dasarnya, yang ingin kita lakukan
‫di sini adalah mengatakan bahwa jika kata sandi belum diubah,
‫jadi tidak, maka dalam hal ini, mari kita kembali
‫dari fungsi ini dan tidak menjalankan kode lain apa
‫pun yang ada di sini
‫lalu panggil middleware berikutnya.
‫Oke?
‫Jadi sekali lagi, jika kata sandi belum diubah, maka
‫keluar saja dari fungsi
‫ini dan panggil middleware berikutnya.
‫Jika tidak, kita akan menjalankan kode yang
‫akan saya masukkan di sini.
‫Jadi sekarang saatnya untuk benar-benar mengenkripsi,
‫atau seperti yang bisa kita katakan, untuk meng-hash kata sandi, oke?
‫Jadi Anda akan melihat istilah "hash" atau "hashing"
‫sepanjang waktu dan itu pada dasarnya juga berarti enkripsi, oke?
‫Sekarang kita akan melakukan enkripsi ini, atau
‫hashing, menggunakan algoritma hashing yang
‫sangat terkenal dan dipelajari dan sangat populer yang disebut bcrypt.
‫Oke?
‫Jadi algoritme ini pertama-tama akan memberi garam kemudian meng-hash
‫kata sandi kita agar benar-benar kuat untuk
‫melindunginya dari serangan bruteforce, oke?
‫Dan itulah alasan
‫mengapa enkripsi harus benar-benar kuat.
‫Karena serangan bruteforce dapat mencoba menebak
‫kata sandi tertentu jika tidak benar-benar kuat terenkripsi.
‫Dan ingat bagaimana saya mengatakan bahwa bcrypt akan memberi garam kata sandi
‫kita dan itu hanya berarti bahwa itu akan menambahkan
‫string acak ke kata sandi sehingga dua kata sandi yang
‫sama tidak menghasilkan hash yang sama, oke?
‫Masuk akal?
‫Sekarang saya tidak akan membahas semua detail kriptografi tentang bagaimana
‫ini benar-benar bekerja di belakang layar
‫dan mengapa kita membutuhkan sistem yang begitu rumit, oke?
‫Tetapi tentu saja Anda dapat membaca semua yang Anda inginkan tentang bcrypt online.
‫Benar-benar ada banyak hal menarik untuk
‫ditemukan di sana, oke?
‫Bagaimanapun, sekarang mari kita lanjutkan dan gunakan paket bcrypt
‫js untuk menggunakan algoritma ini.
‫Jadi, jadi
‫npm install
‫jadi npm install
‫bcryptjs.
‫Oke?
‫Jadi ini pada dasarnya adalah implementasi bcrypt
‫untuk Javascript.
‫Oke?
‫Mari kita kembali ke terminal utama kita
‫lalu melanjutkan dan mengimpornya di sini.
‫Dan yang ini secara default hanya disebut bcrypt, oke?
‫Dan bukan bcryptjs.
‫(mengklik keyboard) Baiklah.
‫Baiklah.
‫Dan sekarang, mari kita benar-benar menggunakannya.
‫Jadi, kami ingin mengatakan bahwa kata sandi titik ini, jadi
‫kata sandi saat ini dalam dokumen
‫ini harus sama dengan bcrypt dot hash harus
‫sama dengan bcrypt dot hash dan kemudian kata
‫sandi kami saat ini.
‫Oke?
‫Dan kemudian di sini kita perlu menentukan parameter biaya, oke?
‫Dan kita sebenarnya bisa melakukan ini dengan dua cara.
‫Jadi cara pertama adalah menghasilkan garam secara manual, sehingga string
‫acak pada dasarnya, yang akan ditambahkan
‫ke kata sandi kita
‫dan kemudian menggunakan garam itu di sini dalam fungsi hash ini.
‫Baiklah?
‫Namun sebaliknya, untuk membuatnya sedikit lebih
‫mudah, kita juga dapat memasukkan parameter cost ke dalam
‫fungsi ini di sini.
‫Dan pada dasarnya itu
‫adalah ukuran seberapa intensif CPU operasi ini, oke?
‫Dan nilai default di sini saya percaya adalah
‫10, tapi sekarang lebih baik menggunakan 12 karena
‫komputer menjadi lebih dan lebih kuat.
‫Jadi seperti 20 tahun yang lalu, Anda bisa menggunakan delapan di
‫sini dan kemudian sedikit lebih lambat dari
‫10, tetapi sekarang pada titik waktu ini, yang terbaik adalah menggunakan 12.
‫Jadi semakin tinggi biaya
‫ini di sini, pada dasarnya semakin intensif
‫CPU prosesnya dan semakin baik kata sandinya akan dienkripsi, oke?
‫Dan tentu saja kita bisa naik
‫lebih tinggi lagi, tapi itu akan memakan waktu terlalu lama, oke?
‫Dan saya akan menunjukkannya kepada Anda sebentar lagi.
‫Oke?
‫Tapi untuk saat ini, mari
‫kita selesaikan ini karena ada satu hal yang tersisa di sini.
‫Jadi hash ini di sini sebenarnya versi asynchronous,
‫tapi ada juga versi synchronous.
‫Tetapi seperti yang sudah Anda ketahui, kami
‫tidak ingin menggunakan
‫versi sinkron karena itu akan memblokir loop acara dan kemudian
‫mencegah pengguna lain menggunakan aplikasi.
‫Jadi seperti yang kita pelajari di awal.
‫Dan tentu saja
‫kami ingin menggunakan versi asinkron yang ini.
‫Dan ini kemudian akan mengembalikan
‫janji dan janji itu, tentu saja, perlu kita tunggu.
‫Jadi, kita perlu menggunakan menunggu dan kemudian mengatakan bahwa fungsi
‫ini adalah fungsi async, seperti ini.
‫Jadi, mari kita rekap itu di sini.
‫Jadi, kami ingin mengatur kata sandi kami
‫saat ini pada dasarnya untuk mengenkripsi versi kata sandi asli ini dengan
‫biaya 12, tidak membuatnya terlalu
‫mudah untuk memecahkan kata sandi, tetapi juga tidak membuat
‫aplikasi terlalu lama untuk mengenkripsi kata sandi, Baiklah?
‫Jadi dengan ini, kami mengenkripsi kata sandi
‫kami dan sekarang pada akhirnya,
‫yang perlu kami lakukan adalah menghapus kata sandi konfirmasi, oke?
‫Karena pada saat ini,
‫kami hanya memiliki hash kata sandi yang sebenarnya, bukan?
‫Jadi, kata sandi titik ini
‫mengkonfirmasi, Jadi,
‫kata sandi titik ini mengkonfirmasi, dan bagaimana
‫kami pada dasarnya menghapus bidang, agar tidak bertahan
‫dalam database adalah dengan mengaturnya ke tidak terdefinisi.
‫Baiklah?
‫Jadi, kita benar-benar hanya membutuhkan konfirmasi kata sandi ini di
‫sini untuk validasi yang telah kita terapkan sebelumnya.
‫Jadi hanya untuk memastikan
‫bahwa pengguna benar-benar memasukkan dua kata sandi
‫yang sama sehingga dia tidak membuat kesalahan dengan kata sandinya.
‫Benar?
‫Dan setelah validasi ini berhasil,
‫kami sebenarnya tidak lagi membutuhkan bidang
‫ini sehingga kami benar-benar tidak ingin menyimpannya ke database.
‫Dan itulah mengapa kami mengaturnya di sini menjadi tidak terdefinisi.
‫Baiklah?
‫Sekarang Anda mungkin bertanya-tanya mengapa ini
‫berhasil karena kami benar-benar menetapkan konfirmasi kata sandi
‫ke yang diperlukan, bukan?
‫Tapi itu berarti bahwa itu adalah input yang
‫diperlukan, bukan berarti itu harus benar-benar disimpan
‫ke database, oke?
‫Sekarang, hanya untuk menyelesaikan, kita tentu perlu juga menelepon berikutnya.
‫Oke?
‫Mari kita simpan.
‫Dan sebenarnya saya akan menambahkan beberapa komentar
‫di sini untuk membuatnya sangat jelas bagi Anda.
‫Jadi pada dasarnya apa yang dilakukannya, adalah hanya
‫menjalankan
‫fungsi ini jika
‫kata sandi benar-benar diubah.
‫Lalu
‫di sini, hash kata sandi dengan biaya 12.
‫Dan kemudian,
‫hapus bidang konfirmasi kata sandi.
‫Oke.
‫Dan sekarang, mari kita lanjutkan dan uji ini.
‫Dan sekarang saya akan membuat pengguna baru dengan data ini
‫dan sekarang mari kita lihat hasilnya.
‫Dan memang, kami sekarang mendapatkan kata sandi yang tampak sangat
‫aneh ini yang memang merupakan versi terenkripsi dari pass1234.
‫Dan juga, seperti yang Anda lihat, konfirmasi kata sandi tidak lagi ada di sini.
‫Oke?
‫Jadi seperti ini, kami sekarang menyimpan pengguna dengan
‫cara yang aman di database kami.
‫Sekarang saya akan menunjukkan cara kerjanya jika kita,
‫misalnya, menyetelnya ke 16 di sini.
‫Dan saya perlu mengubah email di sini.
‫Dan itu sekarang membutuhkan banyak waktu dan saya tidak
‫yakin apakah saya bisa menunggu.
‫Oh, sebenarnya butuh empat setengah detik.
‫Tapi itu masih agak terlalu banyak saya percaya, oke?
‫Jadi, mari kita
‫atur kembali
‫ke 12 dan seharusnya lebih baik, oke?
‫Dan sekarang mari, sekali lagi, hapus
‫pengguna ini di sini yang baru saja kita buat.
‫Dan sebenarnya saya harus menyingkirkan yang pertama
‫ini karena yang ini masih memiliki kata sandi dalam teks biasa.
‫Jadi pengguna ini tidak
‫akan berfungsi saat kita mulai benar-benar
‫memasukkan pengguna berdasarkan kata sandi mereka.
‫Oke?
‫Jadi mari kita singkirkan ini.
‫Oke?
‫Dan juga yang ingin saya tunjukkan di
‫sini adalah bahwa kami memasukkan kata sandi yang sama
‫persis untuk dua pengguna yang kami buat ini, bukan?
‫Tetapi Anda melihat bahwa
‫kata sandi terenkripsi sebenarnya sangat berbeda, bukan?
‫Dan itulah kekuatan mengasinkan kata sandi
‫sebelum melakukan hashing.
‫Baiklah?
‫Jadi seperti ini, kami, sekali lagi, menerapkan manajemen kata sandi yang
‫sangat aman dan baik.