‫Jonas: Jadi
‫dalam kuliah ini kita akan
‫mengimplementasikan fungsi login user berdasarkan password dan alamat
‫email yang diberikan.
‫Dan seperti sebelumnya, konsep memasukkan pengguna pada dasarnya
‫berarti menandatangani token web JSON dan
‫mengirimkannya kembali ke klien.
‫Tetapi dalam kasus ini kami hanya
‫mengeluarkan token jika pengguna benar-benar ada,
‫dan kata sandinya benar.
‫Jadi, mari kita mulai menerapkannya.
‫Ekspor. masuk adalah...
‫permintaan, tanggapan, dan selanjutnya.
‫Dan hal pertama adalah kita benar-benar
‫membaca email dan kata sandi dari badan.
‫Jadi katakanlah const email sama dengan req. tubuh. surel.
‫Oke, dan sekarang eslint memberi kita peringatan ini, atau
‫kesalahan ini sebenarnya, dan dikatakan
‫bahwa kita harus menggunakan perusakan objek, oke?
‫Jadi saya membiarkan ini terjadi di sini
‫dengan sengaja agar saya dapat menunjukkan kepada Anda bagaimana
‫kita dapat melakukannya dengan perusakan ES6.
‫Dan saya rasa saya sudah membicarakan ini sebelumnya
‫di kursus, dan saya juga berharap
‫Anda sudah familiar dengan konsepnya,
‫tapi bagaimanapun, karena nama
‫properti ini di sini sama dengan
‫nama variabel, kita bisa melakukannya
‫seperti ini dan singkirkan nama properti di sini, oke?
‫Dan juga kami ingin mendapatkan kata sandinya.
‫Dan itu akan sama, jadi
‫pada dasarnya kata sandi sama dengan permintaan. tubuh. kata sandi.
‫Dan alih-alih
‫melakukan itu, kita cukup melakukan email dan kata sandi.
‫Jadi seperti ini, pada
‫dasarnya kita membuat dua variabel objek body ini, oke?
‫Jadi pada dasarnya ini
‫adalah bagaimana pengguna akan mengirimkan kredensial login untuk kami periksa.
‫Oke, dan proses pemeriksaan itu memiliki beberapa langkah, jadi
‫mari kita letakkan di
‫sini sebelum kita mulai membuat kode.
‫Jadi pertama-tama kita perlu memeriksa
‫apakah email dan kata sandi benar-benar ada, oke?
‫Kemudian nomor dua, periksa apakah pengguna ada, dan
‫pada saat yang sama apakah kata sandinya benar.
‫Dan ketiga, jika semuanya
‫baik-baik saja, kirim token, jadi token web JSON kembali ke klien.
‫Oke, jadi yang pertama sangat mudah.
‫Jadi jika tidak ada email atau tidak ada kata sandi, maka kami
‫ingin mengirim pesan kesalahan ke klien kami.
‫Sekarang bagaimana kita akan melakukannya?
‫Kami akan melakukannya menggunakan
‫alat yang kami implementasikan tepat di bagian terakhir.
‫Jadi pada dasarnya kesalahan aplikasi kami, ingat itu?
‫Jadi kami hanya akan membuat kesalahan baru
‫di sini, dan middleware penanganan
‫kesalahan global kami kemudian akan mengambilnya dan mengirimkan kesalahan itu kembali ke klien.
‫Jadi mari kita mulai dengan mengimpor kesalahan itu.
‫Jadi ingat yang
‫ini dari kelas AppError kita, kan?
‫Jadi katakanlah AppError, dan kemudian membutuhkan.
‫Jadi naik satu level dari sini, lalu di utilitas, dan
‫kemudian appError.
‫Oke, jadi kita perlu memanggil middleware berikutnya,
‫dan kemudian di sinilah kita melewati kesalahan, ingat itu?
‫Jadi AppError baru, dan
‫pesannya adalah: harap berikan email dan kata sandi.
‫Dan kode kesalahan HTTP adalah 400 untuk permintaan buruk, oke?
‫Dan sekarang saya memiliki
‫beberapa kesalahan di sini, dan sekali lagi eslint membantu saya memperbaiki beberapa bug.
‫Jadi saya melihatnya
‫di sini, sekali lagi, saya menggunakannya dengan T
‫bukan D, dan jika saya menyimpannya sekarang, semuanya benar.
‫Oke, jadi mari kita mulai menguji ini segera.
‫Dan untuk itu
‫saya akan mulai dengan membuat token palsu di sini untuk saat ini, oke.
‫Dan kemudian katakanlah res. status 200 untuk oke.
‫JSON, dan tentu saja, seperti
‫biasa, status ditetapkan ke sukses, dan kemudian juga token kami.
‫Dan hanya itu yang akan
‫kami kirimkan sebagai tanggapan atas login, oke?
‫Jadi tidak ada objek pengguna karena itu tidak perlu sama sekali.
‫Yang kami inginkan sebagai respons untuk masuk
‫sebenarnya adalah token.
‫Itu saja yang penting saat pengguna masuk.
‫Selanjutnya, kita perlu mengimplementasikan rute,
‫jadi mari kita lakukan itu lagi di router pengguna kita, oke?
‫Dan yang ini sebenarnya sangat mirip dengan yang ini.
‫Mari kita duplikat saja dan kemudian
‫ganti pendaftaran di kedua contoh di sini dengan login, oke?
‫Dan sekali lagi, ini hanya berlaku untuk permintaan
‫posting, karena tentu saja
‫kami ingin mengirimkan kredensial login di badan.
‫Dan sekali lagi ini
‫adalah posting, tapi bukan get, bukan patch, dan bukan delete,
‫karena itu tidak masuk akal dalam kasus ini.
‫Jadi mari kita mengujinya segera.
‫Saya akan menyalin URL ini di sini juga.
‫Ini akan menjadi posting, login, dan kemudian tubuh
‫tentu saja.
‫Jadi sekali lagi, mentah dan JSON.
‫Jadi mari kita buat tubuh sederhana di sini.
‫Baiklah, jadi mari kita coba mengirim ini
‫tanpa kata sandi apa pun, dan lihat apa yang terjadi.
‫Dan memang berhasil, jadi kami mendapatkan pesan kami di
‫sini: berikan email dan kata sandi.
‫Dan lagi, karena kami
‫dalam pengembangan, kami mendapatkan semua tumpukan kesalahan
‫ini di sini, dan kesalahan lengkap dengan kode
‫status kami, status, dan juga tentu saja
‫mengatakan bahwa itu adalah kesalahan operasional.
‫Jadi seperti yang kita definisikan di bagian sebelumnya, oke?
‫Sekarang mari kita coba hal yang sama dengan kata sandi.
‫Jadi kata sandi, setel ke Saya pikir ini dia,
‫dan kemudian singkirkan emailnya.
‫Dan itu tentu saja memicu hal yang sama.
‫Oke, dan dengan semua yang benar yang seharusnya berfungsi, dan
‫memang kami mendapatkan token palsu kami di sini.
‫Sekarang hanya satu hal yang harus kita lakukan
‫di sini adalah juga kembali.
‫Jadi kami melakukannya berkali-kali sebelumnya, dan
‫izinkan saya menjelaskannya lagi.
‫Itu hanya karena setelah memanggil middleware
‫berikutnya, kami ingin memastikan
‫bahwa fungsi login ini selesai segera, oke?
‫Dan karena kami tidak memilikinya
‫sebelumnya, Anda sekarang melihat kesalahan ini lagi di sini.
‫Jadi ini sudah agak akrab pada saat ini, kan?
‫Jadi tidak dapat mengatur header setelah dikirim ke klien,
‫karena sekali lagi, kami mengirim dua tanggapan.
‫Pertama respons kesalahan, dan kemudian juga kode ini dijalankan di sini, yang
‫tentu saja tidak boleh dilakukan.
‫Dan sekali lagi kami menggunakan return here untuk memperbaikinya.
‫Oke, selanjutnya, mari kita periksa apakah sebenarnya ada
‫pengguna untuk email yang diposting.
‫Jadi const user, dan sekarang mari kita gunakan findOne sebenarnya,
‫karena kali ini kita tidak memilih pengguna
‫berdasarkan ID, melainkan emailnya, kan?
‫Jadi kita perlu memasukkan objek
‫filter di mana kita bisa mengatakan email sama dengan email, oke?
‫Jadi bidang itu disebut
‫email, dan variabelnya juga disebut email.
‫Jadi di ES6 kita bisa menyingkatnya menjadi begini.
‫Sekarang sebelum kita melanjutkan
‫ke sini, sebenarnya ada sesuatu
‫yang penting yang harus saya lakukan untuk keamanan.
‫Jadi izinkan saya menunjukkannya kepada Anda
‫di Postman, tempat kami mendaftar untuk akun baru.
‫Jadi Anda lihat di sini bahwa
‫di keluaran pengguna, kami benar-benar mendapatkan kata sandinya, oke?
‫Ini sebenarnya dienkripsi, tapi
‫tetap saja, itu bukan praktik yang baik untuk
‫membocorkan data kata sandi ke klien, oke?
‫Misalnya, jika kita mendapatkan semua pengguna di sini, dan
‫rute ini belum diterapkan, tetapi jika
‫kita ingin mendapatkan semua pengguna dari koleksi, maka semuanya
‫akan memiliki kata sandi
‫yang terlihat, dan kita tidak menginginkannya , baik?
‫Dan memperbaikinya sebenarnya cukup mudah, karena
‫kami pernah melakukannya sebelumnya.
‫Yang harus kita lakukan
‫adalah mengucapkan kata sandi, lalu memilih dan menyetelnya ke salah.
‫Dan seperti ini secara otomatis tidak akan pernah muncul di
‫output apa pun.
‫Dan biarkan saya benar-benar
‫membuktikannya kepada Anda dengan mendaftar sebagai sesuatu yang lain, jadi seperti ini.
‫Dan mari kita lihat, oh, sebenarnya kita
‫sudah memiliki pengguna dengan email itu, jadi mari kita lakukan test3.
‫Dan sekarang kata sandinya sebenarnya masih ada di sini,
‫tapi saya rasa itu hanya karena kita bisa membuatnya,
‫dokumen baru ini
‫di sini, dan karena itu tidak
‫benar-benar memilihnya karena kita tidak benar-benar membacanya dari database.
‫Jadi mari kita menerapkan
‫rute ini dengan sangat cepat di
‫sini, itu hanya akan memakan waktu satu menit.
‫Jadi hanya untuk melihat apakah ini di sini benar-benar berfungsi.
‫Karena langkah ini sebenarnya penting
‫untuk apa yang akan kita lakukan selanjutnya, oke?
‫Jadi mari kita lanjutkan dan salin kode ini dari getAllTours,
‫dan tidak benar-benar menyalin, tetapi apa yang akan kita
‫lakukan tentu saja sangat mirip dengan ini.
‫Jadi saya hanya akan
‫menyalin ini, tetapi tanpa fitur API.
‫Jadi aku tidak terlalu tertarik dengan itu, oke?
‫Jadi yang ini sebenarnya
‫akan saya lakukan di pengontrol pengguna, karena mendapatkan semua pengguna
‫tidak ada hubungannya dengan otentikasi.
‫Dan dalam hal ini pengontrol
‫pengguna adalah tempat yang tepat untuk melakukan ini.
‫Sekarang tentu saja saya juga
‫perlu mengimpor model pengguna dengan cepat di
‫sini, jadi mari kita juga menyalinnya dari tourController, yang tidak sama tetapi serupa.
‫Jadi mari kita ambil semua ini ke dalam
‫pengontrol pengguna kita.
‫Yang ini tidak kita butuhkan, tetapi kita juga perlu catchAsync.
‫Oke, jadi tur akan
‫menjadi pengguna, dan ini akan menjadi userModel, oke?
‫Kemudian di sini kami memiliki tur, dan di sini dan di
‫bawah sini, jadi saya menekan Command + D
‫untuk memilih semuanya dan mengubahnya menjadi pengguna.
‫Dan disini tentunya yang kita tunggu adalah User. Temukan.
‫Sekarang karena kita
‫memiliki penantian di sini, kita perlu async, maka kita juga perlu berikutnya, dan
‫karena kita memiliki async
‫di sini, kita kemudian harus membungkus semuanya menjadi catch async.
‫Jadi mari kita lakukan itu.
‫Oke, dan pada
‫titik ini, ini bukan hal baru
‫lagi bagi Anda, kita sudah terbiasa melakukan hal semacam ini, bukan?
‫Jadi, ini seharusnya sudah berfungsi pada saat ini,
‫jadi mari kita coba.
‫Jadi dapatkan semua pengguna, dan sekarang memang kami melihat
‫bahwa kata sandi mereka tidak termasuk dalam output.
‫Dan itu penting karena sebenarnya, di find, jadi kembali ke
‫sini di AuthController, ini di
‫sini sekarang juga tidak akan berisi kata sandi, oke?
‫Dan output dari ini
‫di sini sekarang juga tidak akan berisi kata sandi.
‫Tapi kita perlu password untuk memeriksa apakah
‫itu benar, kan?
‫Jadi kita juga perlu memilihnya secara eksplisit.
‫Jadi ingat bagaimana kita menggunakan pilih sebelumnya
‫untuk pada dasarnya hanya memilih
‫beberapa bidang dari database, hanya yang kita butuhkan?
‫Sekarang dalam hal ini, ketika
‫kita ingin field yang secara default
‫tidak dipilih, kita perlu user plus dan kemudian nama field.
‫Jadi kata sandi dalam hal ini.
‫Dan seperti ini, itu akan kembali ke output, oke?
‫Tentu saja kita perlu menunggu
‫kueri ini, lalu menandai fungsinya sebagai async.
‫Dan seperti sebelumnya,
‫untuk menghindari blok try catch yang jelek
‫itu, bungkus seluruh fungsi ini ke dalam catchAsync.
‫Baiklah, masuk akal?
‫Jadi sekarang mari kita dengan cepat memasukkan pengguna ke konsol, hanya untuk
‫melihat apakah itu berfungsi.
‫Jadi yang ini di sini.
‫Kami mendapatkan kesuksesan kami, dan memang kami mendapatkan pengguna di sini.
‫Jadi dengan email yang baru saja saya
‫posting, dan kata sandinya sekarang juga kembali dimasukkan
‫ke dalam output, oke?
‫Dan sekali lagi, itu karena kami secara eksplisit memilihnya di sini.
‫Jadi sekarang saatnya untuk benar-benar membandingkan kata sandi
‫yang kita miliki di database dengan kata sandi
‫yang baru saja diposting oleh pengguna.
‫Tapi bagaimana kita akan melakukannya?
‫Karena misalnya, kata sandi mungkin,
‫atau dalam contoh ini, pass1234, tetapi kata
‫sandi yang kami simpan di dokumen terlihat seperti ini.
‫Jadi bagaimana kita akan membandingkan ini?
‫Sebenarnya tidak ada cara untuk melakukannya, kan?
‫Tapi sebenarnya ada, yang harus
‫kita lakukan adalah menggunakan paket bcrypt lagi, oke?
‫Jadi kami menggunakan bcrypt untuk menghasilkan kata sandi hash ini, dan kami
‫juga dapat menggunakan paket yang sama
‫untuk pada dasarnya membandingkan kata sandi asli seperti ini di sini dengan
‫kata sandi hash.
‫Tentu saja kata sandi ini di sini, karena dienkripsi, tidak
‫ada cara untuk mendapatkan kembali yang
‫lama, jadi kata sandi asli dari string ini, kan?
‫Jadi itulah inti
‫sebenarnya dari mengenkripsi kata sandi.
‫Jadi satu-satunya cara
‫untuk melakukannya adalah paket ini
‫agar algoritme ini benar-benar mengenkripsi kata sandi
‫ini juga, dan kemudian membandingkannya dengan yang terenkripsi, oke?
‫Jadi mari kita implementasikan fungsi yang akan melakukan
‫itu, dan untuk itu kita akan menggunakan, sekali lagi, paket bcrypt.
‫Dan kita akan melakukannya dalam model pengguna.
‫Dan Anda mungkin bertanya "Mengapa kami melakukannya
‫dalam model "dan bukan hanya di sini," tapi
‫itu, sekali lagi, karena ini benar-benar terkait dengan data itu sendiri.
‫Dan juga kami sudah memiliki paket itu di sana,
‫jadi lebih mudah untuk melakukannya di sana.
‫Jadi mari kita singkirkan string ini, lalu
‫buat fungsi di sini,
‫yang akan memeriksa apakah kata sandi
‫yang diberikan sama dengan yang disimpan dalam dokumen.
‫Jadi untuk pertama kalinya sekarang kita akan membuat
‫sesuatu yang disebut metode instance.
‫Jadi metode instan pada dasarnya adalah metode
‫yang akan tersedia di semua
‫dokumen koleksi tertentu, oke?
‫Dan itu bekerja seperti ini.
‫Jadi sekali lagi, itu didefinisikan
‫pada userSchema, dan kemudian kami mengatakan metode, dan sekarang dalam
‫kasus ini kami ingin memanggil fungsi correctPassword, oke?
‫Jadi fungsinya, sekarang fungsi ini akan menerima
‫calonPassword, jadi kata sandi
‫yang dimasukkan pengguna di dalam
‫tubuh, dan kemudian juga kata sandi pengguna, oke?
‫Sekarang di dalam metode instance
‫ini, karena tersedia di dokumen, kata
‫kunci this sebenarnya menunjuk ke dokumen saat ini.
‫Tetapi dalam kasus ini, karena kita
‫memiliki kata sandi yang disetel untuk memilih salah, jadi ini di sini, ingat?
‫Oke, dan
‫karena itu, ini. kata sandi tidak akan tersedia.
‫Jadi idealnya kita akan melakukannya seperti ini,
‫jadi dengan cara
‫ini kita hanya perlu memasukkan kandidatPassword dan bukan userPassword.
‫Tetapi sekali lagi, saat ini itu
‫tidak mungkin karena kata sandi tidak tersedia di output.
‫Dan itulah
‫mengapa kita sebenarnya harus memasukkan userPassword juga.
‫Jadi tujuan dari fungsi
‫ini adalah untuk benar-benar hanya mengembalikan true atau false.
‫Jadi pada dasarnya benar jika kata sandinya sama,
‫dan salah jika tidak.
‫Jadi kembali, dan kemudian bcrypt yang sudah kita ketahui,
‫dan kemudian kita akan menggunakan fungsi perbandingan, oke?
‫Dan fungsi perbandingannya sangat
‫mudah, yang kita butuhkan hanyalah
‫memasukkan candidatePassword dan userPassword, bukan userSchema, userPassword, oke?
‫Dan seperti fungsi hash di
‫sini, yang ini juga merupakan fungsi asinkron.
‫Dan seperti sebelum kita menggunakan menunggu, dan kemudian di sini async.
‫Oke, masuk akal?
‫Jadi sekali lagi, fungsi perbandingan ini di
‫sini akan mengembalikan nilai
‫true jika kedua kata sandi ini sama, dan false jika tidak.
‫Dan sekali lagi, kami tidak
‫dapat membandingkannya secara manual karena kandidat kata
‫sandi tidak di-hash, jadi itu adalah kata
‫sandi asli yang berasal dari pengguna, tetapi
‫userPassword tentu saja di-hash, dan tanpa
‫fungsi ini di sini kami tidak dapat membandingkannya, oke?
‫Jadi di sini kita mengembalikan true
‫atau false, sekarang yang perlu kita lakukan hanyalah memanggil
‫fungsi ini di authController.
‫Mari kita tutup beberapa ini.
‫Baiklah, jadi ini di sini hanya untuk demonstrasi.
‫Jadi mari kita sebut ini di sini
‫benar, dan sekarang ingat bahwa fungsi yang baru saja kita
‫definisikan adalah metode yang diinstance.
‫Dan karena itu tersedia di semua dokumen pengguna.
‫Jadi variabel ini di sini sekarang
‫adalah dokumen pengguna, bukan?
‫Karena ini adalah hasil dari kueri model pengguna.
‫Dan sekarang kita dapat mengatakan pengguna. kata sandi yang benar.
‫Sekarang yang perlu kita lakukan adalah memasukkan kata sandi
‫kandidat, yaitu kata sandi, ingat.
‫Jadi yang ini di sini, dan kemudian userPassword.
‫Dan begitulah di pengguna. kata sandi, oke?
‫Jadi ini di sini sekarang akan benar atau salah.
‫Baiklah, dan sekarang mari kita benar-benar menggunakan dua
‫variabel ini untuk mengetahui apakah pengguna itu ada
‫dan kata sandinya benar.
‫Jadi kita sudah
‫mengetahuinya, tetapi sekarang kita harus benar-benar menulis pernyataan if kita.
‫Jadi jika tidak ada pengguna, atau kata sandi salah, maka
‫pada dasarnya benar adalah salah, itulah artinya.
‫Dalam hal ini, kami ingin, sekali lagi, kembali
‫dan langsung menuju middleware kami berikutnya dengan AppError
‫baru.
‫Dan dalam hal ini mengatakan email atau kata sandi yang salah, oke?
‫Dan kemudian kode statusnya
‫adalah 401, yang berarti tidak sah, oke?
‫Sekarang kita bisa melakukannya secara
‫terpisah, jadi pertama-tama periksa
‫pengguna, lalu periksa kata sandi yang benar.
‫Tetapi dalam hal ini kami akan
‫memberikan informasi penyerang potensial apakah email atau kata sandi salah.
‫Dan cara ini di sini sedikit lebih kabur.
‫Jadi kami tidak benar-benar menentukan apa yang salah di sini.
‫Jadi jika itu email atau kata sandi.
‫Jadi jika ada penyerang
‫yang mencoba memasukkan beberapa data acak, maka
‫mereka tidak akan tahu apakah email itu
‫benar-benar ada, atau apakah itu hanya kata sandi yang salah, oke?
‫Sekarang hanya dua hal di sini, dan yang
‫pertama adalah bahwa kita benar-benar
‫perlu menunggu fungsi asinkron ini, oke?
‫Jadi ingat bahwa kata sandi yang benar
‫adalah fungsi asinkron, jadi
‫di sini kita juga perlu menunggu untuk itu.
‫Dan kemudian ada masalah
‫lain, karena pengguna ini tidak ada di
‫sini, maka baris kode berikutnya ini benar-benar tidak dapat dijalankan, oke?
‫Karena misalnya pengguna. kata sandi
‫tidak akan tersedia.
‫Jadi kita sebenarnya perlu memindahkan semua ini, atau sebenarnya
‫hanya kode ini, kita
‫akan memindahkannya ke sini ke dalam pernyataan if else.
‫Baiklah, jadi begini, jika pengguna
‫tidak ada, jadi jika ini benar, maka kode ini
‫tidak akan dijalankan di sini, dan
‫tidak akan ada masalah.
‫Tetapi jika pengguna ada, maka itu juga akan menjalankan
‫kode ini dan memeriksa apakah kata sandinya benar.
‫Jadi jika kata sandinya benar,
‫hanya dalam kasus itu kita akan pernah mencapai potongan kode ini di sini.
‫Jadi itulah keseluruhan ide dari fungsi ini.
‫Jadi pada dasarnya kami memeriksa negatifnya.
‫Jadi jika tidak ada email dan tidak ada kata
‫sandi, maka kami mendapatkan kesalahan ini.
‫Jika tidak ada pengguna, atau jika ada kata sandi
‫yang salah, buat kesalahan ini.
‫Tetapi jika tidak ada kesalahan sama
‫sekali, dalam hal ini kita mencapai bagian kode ini, di
‫mana kita sekarang menghasilkan
‫token dan kemudian mengirimkannya kembali ke pengguna.
‫Sekarang membuat token ini akan menjadi hal yang sama persis seperti yang
‫kita lakukan sebelumnya di sini.
‫Jadi daripada mengulang semua kode
‫ini, mari kita buat fungsi untuk ini, oke?
‫Jadi saya akan
‫menyalin kode ini, dan kemudian di sini dengan sangat
‫cepat const signToken, yang akan menerima sebagai satu-satunya masukan ID pengguna.
‫Jadi ID, dan itu akan mengembalikan token, oke?
‫Jadi itu hanya akan menandatangani ini dan mengembalikannya segera.
‫Baiklah, jadi di sini yang
‫akan kita lakukan adalah menandatangani Token dan memasukkan ID ini.
‫Dan tentu saja kita juga perlu mengubahnya di sini, oke?
‫Jadi set ID ini ke ID ini,
‫yang seperti yang sudah Anda ketahui saat ini sama dengan ini.
‫Baiklah, dan sekarang mari kita lanjutkan dan lakukan hal yang sama di sini.
‫signToken, dan dalam hal ini adalah pengguna. _Indo.
‫Fiuh, itu kuliah yang
‫panjang, mari kita lanjutkan dan mencobanya.
‫Jadi sekarang harus bekerja.
‫Jadi ingat, sekarang ini adalah pengguna lain, tetapi saya tahu bahwa ini
‫adalah kata sandi yang saya gunakan.
‫Jadi sekarang mari kita gunakan yang lain,
‫jadi hanya test12, dan mari kita lihat apa yang terjadi.
‫Mari kita tunggu, dan memang, email atau kata sandi salah.
‫Dan tentu saja kami mendapatkan 401,
‫dan memang itu berarti kode kami saat ini sedang menguji
‫kata sandi.
‫Jadi jika kita sekarang memilih kata sandi yang benar, maka itu
‫harus lulus, jadi mari kita tunggu saja.
‫Tapi, kami masih mendapatkan kesalahan ini.
‫Nah, jadi mari kita singkirkan semua pengguna kita di sini,
‫hanya untuk memastikan bahwa itu
‫tidak ada hubungannya dengan pengguna, dan kemudian buat yang baru, oke.
‫Jadi halo@jonas, dan pass1234.
‫Mari kita lanjutkan dan salin, saya akan mengirimkannya sekarang.
‫Dan kredensial ini sekarang pasti benar.
‫Jadi jika tidak bekerja sekarang ada semacam bug.
‫Tapi sekarang benar-benar berhasil, bagus.
‫Jadi di sini adalah token kami, dan terlihat persis seperti sebelumnya, jadi
‫kami dapat berasumsi bahwa itu benar.
‫Sekarang mari kita coba lagi, hapus ini, oke.
‫Dan dengan kata sandi yang salah itu tidak berfungsi.
‫Sekarang mari kita memasukkan kata sandi yang benar dan email yang salah, dan kemudian
‫kita mendapatkan kesalahan yang sama.
‫Jadi salah email atau password.
‫Dan lagi jika kita mengembalikan semuanya, maka
‫kita mendapatkan token baru.
‫Dan jadi kita sekarang benar-benar masuk ke dalam aplikasi.
‫Dan saya tahu ini mungkin terlihat agak
‫abstrak, jadi yang kita dapatkan hanyalah token, dan itu
‫berarti kita masuk ke aplikasi, bukan?
‫Tapi, begitulah cara kerjanya pada otentikasi stateless.
‫Nantinya ketika kita benar-benar membangun website dinamis,
‫maka tentunya akan lebih
‫terlihat jika pengguna sedang login atau logout kan?
‫Tapi itu masih akan bekerja di belakang
‫layar menggunakan token yang sama ini.
‫Jadi jika tidak ada token, maka situs web akan terlihat
‫satu arah, dan jika ada
‫token maka situs web akan melihat ke arah
‫lain, dengan gambar pengguna dan nama pengguna yang ada di situs web, misalnya.
‫Bagaimanapun, ini adalah kuliah yang cukup panjang.
‫Pastikan untuk kembali ke sini dan benar-benar
‫mencoba memahami semua kode yang kita miliki di sini, oke?
‫Karena saya tahu bahwa
‫beberapa di antaranya mungkin agak membingungkan.
‫Misalnya, fungsi correctPassword ini di sini.
‫Dan kemudian saya yakin semuanya akan masuk akal bagi Anda.