‫Instruktur: Dalam video ini dan video
‫berikutnya, kita akan menerapkan
‫fungsionalitas pengaturan ulang kata sandi yang mudah digunakan, yang
‫merupakan standar di sebagian besar aplikasi web.
‫Dan mungkin, Anda telah menggunakan pengaturan ulang kata sandi
‫di beberapa situs web sebelumnya dan biasanya,
‫itu berfungsi seperti ini.
‫Anda hanya perlu memberikan alamat email
‫Anda dan Anda kemudian akan mendapatkan email dengan
‫tautan di mana Anda dapat mengklik dan kemudian itu
‫akan membawa Anda ke halaman di mana Anda dapat memasukkan kata sandi baru.
‫Ini adalah prosedur yang sangat standar dan ini
‫juga bagaimana kami akan menerapkannya di
‫sini dalam aplikasi ini.
‫Pada dasarnya ada dua langkah.
‫Untuk yang pertama adalah pengguna mengirim permintaan
‫posting ke rute lupa kata sandi, hanya dengan alamat email ini.
‫Ini kemudian akan membuat token
‫reset dan mengirimkannya ke alamat email yang diberikan.
‫Hanya token acak sederhana, bukan Token Web JSON.
‫Itu perbedaan di sini.
‫Kemudian di bagian kedua, yang akan menjadi
‫video berikutnya, pengguna kemudian mengirimkan token itu dari
‫emailnya bersama dengan kata sandi baru untuk memperbarui kata sandinya.
‫Pada dasarnya, kita akan mengekspor kata sandi dot lupa yang merupakan
‫langkah pertama.
‫Jadi permintaan, tanggapan, dan selanjutnya sebagai langkah kedua, kami
‫telah mengatur ulang kata sandi.
‫Kalau begitu mari kita lanjutkan dan implementasikan kedua rute ini.
‫Oke, dan itu, tentu saja, di router pengguna atau
‫file rute pengguna mereka.
‫Mari kita letakkan juga di sini
‫dan sebenarnya saya bisa menduplikasi baris ini di sini.
‫Jadi kita kembali lupa kata sandi,
‫yang hanya akan menerima
‫alamat email dan kemudian mengatur ulang kata sandi, yang
‫akan menerima token serta kata sandi baru.
‫Ini adalah salah
‫satu yang akan kita mulai terapkan dalam kuliah ini.
‫Mari kita seperti sebelumnya menentukan langkah-langkah kita di sini.
‫Jadi pertama-tama, dapatkan pengguna berdasarkan
‫email yang diposting
‫lalu buat token acak.
‫Dan kemudian pada dasarnya mengirimkannya kembali sebagai email.
‫Hal ini cukup umum bagi kita pada saat ini.
‫Jadi pengguna, jadi mari kita tunggu pengguna dot find dan
‫sekarang menemukannya, bukan menemukan
‫id karena kami tidak tahu id pengguna.
‫Dan pengguna, tentu saja, juga tidak tahu id-nya
‫sendiri, jadi kami menentukan alamat emailnya.
‫Pada dasarnya itu satu-satunya bagian dari data yang diketahui.
‫Dan itu adalah alamat email stand on request dot body dot.
‫Dan tentu saja sekarang kita
‫perlu mengatakan bahwa kita berada dalam fungsi async dan kemudian seperti sebelumnya, mari kita
‫bungkus dalam catch async.
‫Berikan simpanan dan kesalahannya akan hilang.
‫Kemudian langkah selanjutnya, mari kita verifikasi
‫apakah pengguna memang ada.
‫Jadi jika tidak ada user, maka kembali ke middleware berikutnya
‫bersama tentunya dengan error baru.
‫Apakah tidak ada pengguna dengan alamat email tersebut.
‫Dan kemudian kita dapat menempatkan 404, yang seperti yang sudah Anda
‫ketahui, artinya tidak ditemukan.
‫Selanjutnya, mari kita buat token acak dan untuk
‫itu, sekali lagi, kita
‫sebenarnya akan membuat metode instan pada pengguna.
‫Karena sekali lagi, ini benar-benar berkaitan dengan
‫data pengguna itu sendiri.
‫Dan kita akan benar-benar menulis sedikit
‫kode, jadi, jika itu hanya satu baris kode,
‫maka tentu saja kita bisa meletakkannya di sini.
‫Tetapi kita membutuhkan beberapa baris
‫kode dan sekali lagi, akan sedikit lebih
‫bersih untuk memisahkannya ke dalam fungsinya sendiri.
‫Dan itu biasanya dengan luwak adalah yang terbaik sebagai metode instan.
‫Jadi di sini, mari kita edit di sini di akhir.
‫Jadi metode dot skema pengguna dot membuat token reset kata sandi.
‫Nama yang cukup panjang dan deskriptif.
‫Saya suka melakukannya seperti itu,
‫sehingga saya tahu persis apa yang saya hadapi.
‫Token reset kata sandi pada dasarnya harus berupa string acak tetapi
‫pada saat yang sama, itu
‫tidak perlu sekuat kriptografis seperti hash kata sandi yang kita
‫buat sebelumnya.
‫Kita bisa menggunakan fungsi byte acak yang sangat
‫sederhana dari modul kripto bawaan.
‫Mari kita lanjutkan dan benar-benar menambahkan itu.
‫Crypto memerlukan dan sekali lagi, ini adalah modul simpul bawaan sehingga
‫tidak perlu menginstal apa pun.
‫Dingin.
‫Sekarang, mari kita benar-benar menghasilkan token kita.
‫Dan untuk itu, kita menggunakan crypto dot random byte dan
‫kemudian di sini kita perlu menentukan jumlah
‫karakter pada dasarnya.
‫Dan kemudian kami juga
‫pada akhirnya, mengubahnya menjadi string heksadesimal.
‫Dua string
‫dan kemudian kita dapat menentukan opsi hex di sini.
‫Sekarang jika Anda
‫bertanya-tanya mengapa kami benar-benar
‫membuat token ini, saya rasa saya belum benar-benar menjelaskannya.
‫Pada dasarnya token ini adalah apa yang
‫akan kami kirim ke pengguna dan jadi itu seperti kata sandi
‫reset yang benar-benar dapat digunakan pengguna untuk membuat kata sandi baru yang sebenarnya.
‫Dan tentu saja, hanya pengguna yang memiliki akses ke token ini.
‫Dan faktanya, itu benar-benar berperilaku seperti kata sandi.
‫Karena pada dasarnya ini hanyalah sebuah kata sandi, itu
‫berarti bahwa jika seorang peretas dapat mengakses database kami, maka itu
‫akan memungkinkan peretas untuk mendapatkan akses ke akun
‫tersebut dengan menetapkan kata sandi baru.
‫Jika kami hanya menyimpan token reset ini
‫di database kami sekarang, maka jika beberapa penyerang mendapatkan akses ke
‫database, mereka kemudian dapat menggunakan token
‫itu dan membuat kata sandi baru menggunakan token itu
‫alih-alih Anda melakukannya.
‫Mereka kemudian akan secara efektif mengontrol akun
‫Anda alih-alih Anda melakukannya.
‫Sama seperti kata sandi, kita
‫tidak boleh menyimpan token reset biasa di database.
‫Mari kita mengenkripsinya, tetapi
‫seperti sebelumnya dengan kata sandi,
‫itu tidak memerlukan metode enkripsi yang kuat
‫secara kriptografis.
‫Karena token reset ini adalah vektor serangan yang
‫tidak terlalu berbahaya.
‫Sekali lagi, kita hanya akan menggunakan modul
‫kripto bawaan.
‫Ia bekerja dengan cara yang tampak aneh seperti ini.
‫Kami mengatakan crypto kemudian membuat hash
‫dengan algoritma sha 256 maka kami perlu
‫mengatakan pembaruan
‫dan kemudian variabel tempat token disimpan.
‫String apa pun yang ingin kami enkripsi pada dasarnya.
‫Dan kemudian kita perlu mengatakan intisari dan sekali lagi
‫menyimpannya sebagai heksadesimal.
‫Dan sekarang di mana kita akan menyimpan token reset ini?
‫Nah, kita akan membuat field baru di skema database kita.
‫Karena tentu saja, kami ingin menyimpannya di
‫database, sehingga kami dapat
‫membandingkannya dengan token yang diberikan pengguna.
‫Mari kita lakukan itu di sini di akhir.
‫Token reset kata sandi,
‫itulah stringnya.
‫Dan kemudian juga reset kata sandi kedaluwarsa.
‫Karena reset ini
‫sebenarnya akan kedaluwarsa setelah jangka waktu tertentu sebagai tindakan pengamanan.
‫Anda hanya memiliki waktu 10 menit untuk benar-benar mereset
‫kata sandi Anda.
‫Sekarang mari kita lanjutkan dan gunakan ini.
‫Token reset kata sandi titik ini kemudian sama dengan
‫enkripsi ini.
‫Selanjutnya, mari kita atur ulang kata sandi kedaluwarsa dan
‫mari kita atur itu ke titik tanggal sekarang dan kemudian cukup
‫tambahkan beberapa detik untuk itu.
‫Kami ingin itu bekerja selama
‫10 menit dan itu 10 dan kemudian kami membutuhkannya dalam milidetik.
‫Kali 60 untuk detik dan kemudian kali 1000 untuk milidetik.
‫Dan kemudian saya juga ingin mengembalikan token teks biasa
‫karena itu sebenarnya yang akan kami kirimkan
‫melalui email.
‫Kembalikan token setel ulang.
‫Kami perlu mengirim melalui email token
‫reset yang tidak terenkripsi karena jika tidak,
‫tidak masuk akal untuk mengenkripsi sama sekali.
‫Jika token yang ada
‫di database sama persis dengan yang bisa
‫kita gunakan untuk benar-benar mengubah
‫kata sandi, maka itu sama sekali bukan enkripsi.
‫Kami mengirim satu token melalui
‫email dan kemudian kami memiliki versi terenkripsi di database kami.
‫Dan yang terenkripsi itu pada dasarnya tidak berguna
‫untuk mengubah kata sandi.
‫Ini seperti ketika kita
‫hanya menyimpan kata sandi terenkripsi itu sendiri
‫ke database, seperti yang kita lakukan di sini, Jadi
‫di mana kita mengenkripsi kata sandi menggunakan bcrypt.
‫Ingatlah bahwa satu-satunya yang pernah menyimpan
‫data sensitif dalam bentuk terenkripsi dan
‫kemudian membandingkannya dengan versi terenkripsi yang ada
‫di database.
‫Cukup dengan memasukkan keduanya ke
‫konsol yang akan membuat hidup kita sedikit lebih mudah di kemudian hari.
‫Katakanlah reset token dan saya masuk di
‫sini sebagai
‫objek karena dengan cara ini, ia akan benar-benar memberi
‫tahu saya nama variabel beserta nilainya.
‫Dan kemudian sama dengan token reset kata sandi titik ini.
‫Yang ini tidak benar-benar berfungsi dengan
‫objek penulisan, cara ES6 baru ini dan
‫biarkan saja di sini.
‫Bagaimanapun, mari kita kembali
‫ke sini dan kemudian menggunakan fungsi itu.
‫Jadi ingat bagaimana kita mengembalikan token reset, dan mari
‫kita simpan di sini.
‫Jadi token reset sama dengan set titik pengguna dan saya tidak
‫yakin lagi dengan namanya.
‫Buat token reset kata sandi, jadi
‫itu panjang.
‫Baiklah dan itu sudah selesai, tetapi
‫sebenarnya yang kami lakukan hanyalah memodifikasi data
‫di sini.
‫Ketika kami menetapkan kata sandi titik ini kedaluwarsa misalnya
‫ke nilai ini, kami sebenarnya tidak
‫benar-benar memperbarui dokumen.
‫Kami tidak menyimpannya.
‫Kami benar-benar hanya
‫memodifikasinya, tetapi sekarang kami harus menyimpannya.
‫Katakanlah menunggu pengguna titik simpan.
‫Tapi perhatikan apa yang terjadi saat kita sekarang menggunakan ini.
‫Mari kita ambil yang ini di sini.
‫Ini adalah rute yang kami temukan sebelumnya.
‫Dan sekarang kita mendapatkan rute ini belum ditentukan.
‫Mari kita lihat mengapa demikian.
‫Di rute pengguna, kami jelas memiliki url yang sama di sini, tetapi
‫saya melihat bahwa kami sebenarnya perlu melakukan permintaan posting.
‫Baiklah, oke, tapi sekarang kami mendapatkan pesan kesalahan yang mengatakan
‫tolong berikan email dan kata sandi.
‫Dan itulah yang saya maksud ketika saya mengatakan perhatikan
‫apa yang terjadi ketika Anda mencoba ini.
‫Itu terjadi karena kita mencoba untuk menyimpan dokumen,
‫tetapi kita tidak menentukan semua data wajib, sehingga bidang
‫yang kita tandai sebagai wajib diisi.
‫Ayo cepat perbaiki itu.
‫Yang perlu kita lakukan adalah benar-benar memberikan opsi
‫khusus ke metode penyimpanan titik pengguna ini.
‫Kami
‫mengatakan validasi sebelum simpan
‫disetel ke false.
‫Ini kemudian akan menonaktifkan semua validasi yang kami
‫tentukan dalam skema kami.
‫Hal-hal kecil inilah yang perlu Anda ketahui yang
‫akan membuat semua perbedaan.
‫Sekarang saya juga tidak benar-benar tahu bahwa ini ada karena
‫tidak ada yang benar-benar tahu semua hal itu.
‫Tidak mungkin.
‫Perpustakaan seperti Mongoose terlalu besar bagi Anda untuk
‫mengetahui semua yang ada.
‫Saya melanjutkan dan membaca dokumentasi Mongoose dan
‫di situlah saya menemukan opsi yang sangat membantu ini.
‫Semua ini hanya untuk mengatakan itu lagi,
‫tidak ada yang tahu
‫segalanya dan jadi itu benar-benar kebiasaan
‫yang baik jika
‫Anda mengalami beberapa masalah untuk
‫melihat dokumentasi untuk perpustakaan yang Anda gunakan.
‫Mari kita lihat ini sekarang.
‫Dan kita masih mendapatkan kesalahan yang sama di sini, tetapi
‫saya melihat di sini
‫bahwa itu sebenarnya berasal dari fungsi login.
‫Mari kita lihat apa yang terjadi di sini.
‫Mari kita lihat juga rutenya.
‫Ah, oke, jadi inilah masalahnya.
‫Kami sekarang mencoba memanggil
‫handler login, yang tentu saja tidak masuk akal.
‫Ini dia lupa kata sandi.
‫Ini dia reset password.
‫Jadi kesalahan yang kami dapatkan sebelumnya sebenarnya bukan
‫karena validasi.
‫Mari kita kirim ini lagi
‫dan sekarang kita mendapatkan kesalahan bahwa tidak
‫ada pengguna dengan
‫alamat email ini dan itu karena kita tidak menentukan
‫alamat email apa pun di badan.
‫Kami mengujinya
‫dan sekarang saatnya untuk benar-benar mengujinya
‫dengan email pengguna.
‫Baiklah.
‫Jadi sekarang seharusnya tidak melakukan
‫apa-apa karena kami tidak mengirim kembali tanggapan apa pun.
‫Mari kita batalkan
‫saja ini karena saya benar-benar
‫tertarik untuk melihat token ini di sini
‫dan kemudian juga untuk melihat objek pengguna.
‫Ini di sini adalah token reset asli, jadi Anda
‫lihat ini adalah string heksadesimal acak dan kemudian
‫kami mendapatkan yang terenkripsi di sini.
‫Ingat ini adalah yang tidak boleh ada di
‫database, jadi diakhiri dengan a901.
‫Mari kita lihat itu.
‫Dan memang, ini dia,
‫token reset kata sandi yang diakhiri dengan a901 ini.
‫Dan juga tanggalnya, yang sebenarnya 10 menit dari sekarang.
‫Sekarang Anda tahu jam berapa saya merekam video ini.
‫Bagaimanapun, tapi ini bekerja dengan baik.
‫Jadi ini sebenarnya adalah bagian
‫pertama dari pembuatan fungsi pengaturan ulang kata sandi ini.
‫Di video berikutnya, kami
‫akan mengirimkan token ini ke sini melalui email ke pengguna
‫dan sebenarnya kami menyiapkan video terpisah hanya
‫untuk mempelajari cara mengirim email dengan node
‫ke js.
‫Itu sangat menyenangkan
‫jadi jangan menunggu untuk pindah ke sana segera.