‫-: Jadi, selama beberapa video
‫terakhir, kami mengizinkan pengguna untuk mengatur ulang
‫kata sandinya dan kemudian
‫membuat yang baru,
‫tetapi sekarang kami juga ingin mengizinkan pengguna yang
‫masuk untuk memperbarui kata sandinya tanpa
‫harus melupakannya, dan seterusnya tanpa seluruh proses reset.
‫Jadi, mari kita bangun itu sekarang.
‫Dan, seperti sebelumnya,
‫mari kita lakukan itu di pengontrol otentikasi kita.
‫Jadi, ekspor. perbarui kata sandi.
‫Baiklah, dan, seperti biasa, tiga
‫parameter Middleware kami di sini, dan oke.
‫Sekarang ingat bahwa fungsi pembaruan kata sandi ini hanya untuk
‫pengguna yang masuk, tetapi kita
‫tetap membutuhkan pengguna untuk memasukkan kata sandinya saat ini, jadi
‫untuk mengonfirmasi bahwa
‫pengguna sebenarnya adalah siapa yang dia katakan.
‫Jadi, hanya sebagai tindakan pengamanan
‫karena bayangkan seseorang akan menemukan komputer Anda terbuka dan
‫kemudian dapat mengubah kata sandi di situs
‫yang sedang
‫Anda buka tanpa diminta kata sandi lagi.
‫Dan itu pada dasarnya akan
‫mengeluarkan Anda dari semua aplikasi yang ada, yang
‫tentu saja akan menjadi pengalaman yang mengerikan.
‫Jadi, sebagai tindakan pengamanan, kita harus
‫selalu menanyakan kata sandi saat ini sebelum memperbaruinya, oke.
‫Dan, dengan mengingat hal itu, mari kita
‫susun semua langkah yang perlu
‫kita ambil untuk mengimplementasikan fungsi ini seperti sebelumnya.
‫Jadi, pertama-tama, kita perlu mendapatkan pengguna
‫dari koleksi, pada dasarnya.
‫Kemudian kedua, kita perlu memeriksa
‫apakah kata sandi yang diposting sudah benar.
‫Benar.
‫Kemudian, ketiga, jadi jika kata sandinya benar,
‫maka perbarui kata sandinya.
‫Dan akhirnya, kita perlu login kembali pengguna,
‫jadi pada dasarnya untuk mengirim jsonwebtoken kembali ke pengguna, sekarang
‫login dengan kata sandi baru yang baru saja diperbarui.
‫Oke, dan ini sebenarnya sangat mirip dengan apa yang
‫sudah kita lakukan
‫sebelumnya, jadi saya meninggalkan yang
‫ini untuk Anda sebagai tantangan, oke?
‫Jadi, silakan coba untuk melanjutkan dan menerapkan ini sendiri,
‫dan jika perlu, tentu saja Anda dapat melihat
‫kode yang kami
‫tulis sebelumnya, tetapi cobalah untuk menulis kode sendiri
‫tanpa menyalin terlalu banyak, oke ?
‫Jadi, Anda dapat melihat kode lainnya
‫untuk melihat cara kerjanya, tetapi jangan hanya menyalinnya, oke?
‫Karena dengan begitu Anda tidak akan benar-benar belajar, oke.
‫Jadi, jeda video di sini, dan saya akan melihat Anda
‫sebentar lagi dengan solusi saya.
‫Oke, jadi saya harap Anda berhasil menerapkan
‫ini dan membuatnya berfungsi, beginilah cara saya melakukannya.
‫Jadi, seperti biasa, kami membuat variabel pengguna baru, dan di sana
‫kami menunggu hasil dari Pengguna. findById, dan sekarang
‫dari mana ID ini sebenarnya berasal?
‫Nah, ingat lagi bahwa kata sandi pembaruan ini hanya untuk yang
‫diautentikasi, jadi untuk pengguna yang masuk, dan oleh karena
‫itu, pada titik ini, kita sudah memiliki pengguna saat
‫ini di objek permintaan kita.
‫Oke, jadi itu datang dari melindungi Middleware.
‫Jadi, permintaan pengguna. id, dan kemudian
‫ingat bahwa kita perlu meminta kata sandi secara eksplisit, oke?
‫Karena itu, secara default, tidak termasuk dalam output.
‫Jadi, kami mendefinisikannya di skema, ingat?
‫Dan, kita sebenarnya membutuhkan kata
‫sandi itu karena sekarang kita ingin membandingkannya dengan kata
‫sandi yang tersimpan di database,
‫dan untuk itu,
‫seperti sebelumnya, kita akan menggunakan objek instance yang kita miliki
‫di suatu tempat di sini.
‫Ya, jadi correctPassword, yang tersedia di
‫semua dokumen pengguna,
‫jadi pertama-tama dibutuhkan kata sandi
‫kandidat, dan kemudian kata sandi pengguna yang sebenarnya, oke.
‫Oh, dan sekarang ini
‫memberi saya kesalahan ini karena, tentu saja, saya
‫belum mendeklarasikan ini sebagai fungsi async.
‫Jadi, async, dan sebelum kita melupakannya,
‫mari kita bungkus ke dalam fungsi catchAsync di sini juga.
‫Bagaimanapun, seperti sebelumnya, pada
‫dasarnya kita ingin membuat kesalahan di sini
‫jika kata sandi saat ini tidak benar, jadi,
‫mari kita tulis dalam kode.
‫Jadi, jika bukan pengguna. correctPassword, dan
‫kemudian kandidat password mengingat,
‫dan salah satunya akan berada
‫di body, di properti yang akan kita sebut sebagai passwordConfirm.
‫Oke, dan kemudian sebagai argumen kedua kata sandi yang sebenarnya, jadi
‫itu pengguna. kata sandi.
‫Dan kemudian, ingat bahwa ini adalah fungsi asinkron,
‫jadi kita juga perlu menunggunya di sini.
‫Bagus, jadi jika kata sandinya salah, seperti biasa,
‫kami membuat kesalahan baru di sini.
‫Jadi, AppError baru, dan kali ini
‫kami mengatakan kata sandi Anda saat ini salah,
‫dan kemudian kode status 401 untuk tidak sah.
‫Baiklah, bagus.
‫Sekarang, jika kita sampai pada titik ini
‫dalam kode, jadi pada dasarnya jika kata sandinya juga benar,
‫maka kita benar-benar dapat memperbarui kata sandi,
‫dan bagaimana kita melakukannya?
‫Yah, sangat sederhana, kami melakukan itu sebelumnya.
‫Yang kami katakan hanyalah pengguna. kata sandi sama dengan req. tubuh. kata sandi,
‫dan kemudian sama, tentu saja, untuk konfirmasi kata sandi.
‫Oke, dan validasi akan dilakukan secara otomatis oleh
‫validator yang kita tentukan pada skema, dan itu akan
‫dilakukan setelah kita benar-benar menyimpannya.
‫Jadi, kami menunggu pengguna. simpan, jadi kali
‫ini kami tidak mematikan validasi karena
‫tentu saja kami ingin validasi terjadi, jadi
‫seperti yang saya katakan sebelumnya, kami ingin
‫memeriksa bahwa konfirmasi kata sandi sebenarnya
‫sama dengan kata sandi, kan?
‫Bagus.
‫Dan, sekarang hanya untuk benar-benar memastikan bahwa Anda memahami mengapa kami
‫tidak melakukan sesuatu seperti user. findByIdAndUpdate.
‫Jadi, mengapa kita tidak melakukannya seperti ini?
‫Dan, saya tahu bahwa saya telah membicarakan hal ini berkali-kali
‫sebelumnya, tetapi saya ingin Anda memahami seratus persen mengapa
‫kami tidak dapat menggunakan pembaruan ini, dan itu
‫karena dua alasan,
‫jadi izinkan saya kembali ke model kami.
‫Jadi, yang
‫pertama validasi ini di sini tidak akan berhasil, oke?
‫Dan itu pada dasarnya karena ini. kata sandi tidak ditentukan
‫ketika kami memperbarui, jadi ketika kami menggunakan find by ID dan memperbarui, karena
‫secara internal, di belakang layar, Mongoose
‫tidak benar-benar menyimpan objek saat ini dalam memori, dan oleh
‫karena itu, ini di sini tidak akan berfungsi.
‫Dan, seperti yang saya katakan, saya sudah
‫membicarakannya sebelumnya, jadi sebenarnya ditulis di sini juga, oke?
‫Tapi, sangat penting untuk diingat untuk tidak
‫menggunakan pembaruan untuk apa pun yang terkait dengan kata sandi, oke?
‫Jadi, yang ini tidak
‫akan berfungsi, dan juga, dua Middleware
‫yang telah disimpan sebelumnya juga tidak akan berfungsi.
‫Jadi, jika kita hanya menggunakan pembaruan untuk memperbarui
‫kata sandi, maka kata sandi itu tidak akan
‫dienkripsi, yang merupakan
‫Middleware pertama ini, dan kemudian, cap
‫waktu kata sandiChangedAt juga tidak akan disetel, oke?
‫Jadi, semua ini tidak akan
‫berhasil, dan sekali lagi, kita benar-benar perlu melakukannya seperti ini.
‫Mari kita taruh itu di sini lagi.
‫Jadi sekarang, (bergumam), kami memasukkan
‫pengguna, dan mengirim token kembali ke klien.
‫Nah, itu sebenarnya akan menjadi keempat kalinya
‫kita melakukan kode yang sama, jadi
‫pada dasarnya potongan kode ini,
‫dan sekarang, dengan sangat cepat memfaktorkan ulang ini
‫ke dalam fungsinya sendiri.
‫Sekarang, kode ini sebenarnya tidak sama di mana-mana.
‫Jadi, di sini kami mengirim kode status
‫400, dan kami tidak
‫mengirim pengguna, tetapi kemudian di sini di pengendali pendaftaran, kami
‫sebenarnya memiliki kode status yang berbeda,
‫dan kami juga mengirim pengguna ke klien, oke?
‫Jadi, mari kita buat fungsi kita benar-benar mengingatnya.
‫Jadi, mari kita buat fungsi di sini, buat dan
‫kirim token, lalu argumen yang kita
‫butuhkan di sini adalah pengguna karena
‫di situlah ID disimpan.
‫Kemudian, kita juga
‫menginginkan kode status, dan tentu saja, kita perlu memiliki
‫akses ke objek respons agar benar-benar dapat
‫mengirim respons kembali ke klien, oke?
‫Jadi, pada dasarnya sekarang yang kita butuhkan adalah kode ini.
‫Jadi, mari kita salin, taruh
‫di sini, lalu ganti variabel yang tidak relevan.
‫Jadi, pengguna hanya disebut pengguna, jadi seperti ini,
‫dan di sini, sama.
‫Jadi, bukan
‫pengguna baru, dan kemudian di sini kita menggantinya dengan
‫kode status, jadi kode yang masuk ke fungsi
‫kita, jadi saya rasa itu saja.
‫Jadi, sekarang mari kita lanjutkan
‫dan menggantinya, jadi buatSendToken, dan di sini pengguna disebut pengguna baru,
‫kode statusnya adalah
‫201, dan tentu saja objek respons.
‫Oke, sekarang kita bisa menyingkirkan kode ini, dan mari
‫kita salin saja.
‫Baiklah, jadi pada saat login tentunya kita juga mengirimkan token,
‫namun kali ini user tersebut sebenarnya disebut user dan kode
‫statusnya adalah 200.
‫Dan sekarang, mari kita salin yang ini.
‫Jadi, yang berikutnya harus di sini, dan reset
‫kata sandi, dan
‫ini sebenarnya sama, jadi namanya pengguna
‫dan kode 200, dan sekarang, akhirnya, ini juga sama.
‫Jadi, itu menyelesaikan fungsi kata sandi pembaruan kami.
‫Sekarang, agar ini berfungsi,
‫tentu saja kita perlu mengimplementasikan rute di sini juga di
‫router pengguna kita.
‫Jadi, router. patch, dan kami akan
‫melakukan patch karena kami benar-benar berubah, jadi
‫kami memanipulasi dokumen pengguna, dan itulah gunanya patch.
‫Dan rutenya disebut updateMyPassword.
‫Jadi, kata sandi saya
‫karena itu untuk pengguna yang saat ini masuk, dan kemudian ingat,
‫sekali lagi, ini hanya berfungsi untuk pengguna
‫yang masuk, jadi kita perlu menggunakan authController. melindungi, yang kemudian juga
‫akan menempatkan objek
‫pengguna pada objek permintaan, oke?
‫Jadi, lindungi, lalu perbarui kata sandi authController
‫yang baru saja kita buat, oke.
‫Jadi, sekarang mari kita benar-benar pergi ke depan dan menguji ini, oke?
‫Jadi, mari kita salin rute ini di sini,
‫jadi UpdateMyPassword, dan sekarang
‫yang perlu kita kirimkan ke dalam isi adalah ketiga kata
‫sandi ini sebenarnya, jadi pada
‫dasarnya adalah passwordCurrent, dan untuk saat ini saya biarkan kosong,
‫saya hanya ingin
‫meletakkan bidang nama di sini untuk saat ini.
‫Jadi, passwordCurrent kemudian hanya password, yang pada dasarnya
‫adalah yang baru,
‫dan kemudian, tentu saja, passwordConfirm.
‫Oke, dan sekarang kita sebenarnya perlu login
‫sebagai pengguna karena ingat, ini
‫hanya berfungsi jika pengguna sudah login, oke.
‫Jadi, mari kita lakukan dengan administrator di sini.
‫Dan ini di sini, harus tetap kata sandi saat
‫ini, dan memang, kita sekarang masuk.
‫Dan ingat bahwa token ini sekarang disimpan
‫ke dalam variabel lingkungan JWT,
‫jadi, di sini, untuk mengotentikasi, mari
‫kita gunakan itu seperti yang kita lakukan sebelumnya.
‫Jadi, di tab otorisasi ini, kami memilih Token Pembawa,
‫dan kemudian akan secara otomatis mengisi
‫variabel JWT ini.
‫Baiklah, dan dari situlah
‫sebenarnya ID pengguna akan datang, ingat?
‫Bagaimanapun, sekarang mari kita tentukan kata sandi saat ini, jadi pass1234, lalu
‫katakan kata sandi baru, oke?
‫Salin dan tempel
‫di sini, tetapi sebenarnya sekali lagi, saya
‫ingin memulai dengan mengujinya dengan konfirmasi kata
‫sandi yang salah, hanya untuk melihat apakah validasi
‫kami masih berfungsi, dan sekarang rutenya tidak ditentukan,
‫tetapi itu hanya karena kami menggunakan kata kerja yang salah di sini.
‫Tentu saja, itu perlu ditambal.
‫Mari kita coba lagi,
‫tetapi sekarang kami mendapatkan kata sandi Anda saat ini
‫salah, tetapi sebenarnya tidak, jadi itu sebenarnya benar.
‫Jadi, pasti ada yang salah dengan kode kita, jadi mari
‫kita coba lihat di sini.
‫Dan ya, jadi di sini
‫sebenarnya masalahnya karena kami tidak ingin membandingkan atau mengkonfirmasi kata sandi,
‫tentu saja, tetapi dengan kata sandi saat ini.
‫Oke, jadi itu hanya bug bodoh, oke, dan sekarang
‫seharusnya sudah berfungsi.
‫Jadi, tentu saja, kami ingin membandingkan kata sandi
‫saat ini dengan kata
‫sandi yang saat ini tersimpan di database, oke.
‫Jadi, mari
‫kita coba lagi, dan itulah kesalahan validasi
‫yang kita cari, jadi
‫kata sandinya tidak sama karena memang tidak.
‫Dan sekarang, sebelum benar-benar memperbarui kata sandi, mari
‫kita lihat Kompas di sini.
‫Mari kita perbarui di sini dengan
‫cepat, dan sekarang, ini adalah kata sandinya.
‫Jadi, berakhir di sini adalah pW1i, oke?
‫Jadi, mari perbarui kata
‫sandinya sekarang dan lihat seperti apa nanti, oke?
‫Jadi, sekarang semuanya harus benar.
‫Dan, memang, kami mendapatkan kesuksesan dan token kami, baiklah.
‫Jadi, mari kita konfirmasikan di sini dengan
‫cepat, dan, memang, Anda melihat bahwa kata sandi
‫berubah dan juga stempel waktu saat
‫ini, jadi waktu di mana pada dasarnya saya merekam video ini.
‫Baiklah, dan sekarang, seperti sebelumnya, mari kita
‫lakukan tes ini di sini.
‫Jadi, pada dasarnya menyimpan token sebagai variabel lingkungan.
‫Jadi, agar semuanya benar-benar berfungsi di sini di Postman.
‫Oke, mari kita simpan
‫itu sebenarnya, perbarui kata sandi pengguna saat ini untuk membuatnya benar-benar
‫eksplisit, dan ya, saya pikir itu saja.
‫Saya rasa hanya ini yang perlu kita lakukan
‫untuk memperbarui kata sandi pengguna .
‫Selanjutnya, kami akan mengimplementasikan pembaruan data pengguna lain,
‫seperti email atau kata sandi.