Cara Membuat Aplikasi Survei Vue Menggunakan Otentikasi dan Basis Data Firebase
Cara Membuat Aplikasi Survei Vue Menggunakan Otentikasi dan Basis Data Firebase
Diterbitkan: 2022-03-10
Ringkasan cepat Tutorial ini akan membawa Anda pada panduan langkah demi langkah untuk membangun aplikasi survei fungsional menggunakan Vue.js dan Firebase. Dari memvalidasi data pengguna melalui Vuelidate, hingga autentikasi, menyimpan data pengguna, proteksi rute, dan mengirim data ke server Firebase. Semua langkah yang digunakan dalam tutorial ini praktis, dan dapat direproduksi dalam proyek kehidupan nyata apa pun, bahkan dengan backend khusus.
Dalam tutorial ini, Anda akan membuat Aplikasi Survei, tempat kita akan belajar memvalidasi data formulir pengguna, menerapkan Otentikasi di Vue, dan dapat menerima data survei menggunakan Vue dan Firebase (platform BaaS).
Saat kami membangun aplikasi ini, kami akan mempelajari cara menangani validasi formulir untuk berbagai jenis data, termasuk menjangkau backend untuk memeriksa apakah email sudah diambil, bahkan sebelum pengguna mengirimkan formulir saat mendaftar.
Selain itu, aplikasi akan menangani proses masuk pengguna dengan API yang tenang. Itu akan menggunakan Authguard di router Vue untuk mencegah pengguna yang tidak masuk mendapatkan akses ke formulir survei, dan berhasil mengirim data survei pengguna yang masuk ke database yang aman.
Agar kita berada di halaman yang sama, mari kita perjelas apa itu Firebase, dan apa yang akan dilakukannya dalam tutorial ini. Firebase adalah perangkat untuk "membangun, meningkatkan, dan mengembangkan aplikasi Anda", ini memberi Anda akses ke sebagian besar layanan yang biasanya harus dibuat sendiri oleh pengembang, tetapi tidak benar-benar ingin dibangun, karena mereka lebih suka berfokus pada pengalaman aplikasi itu sendiri. Ini termasuk hal-hal seperti analitik, otentikasi, database, penyimpanan file, dan daftarnya terus berlanjut.
Ini berbeda dari pengembangan aplikasi tradisional, yang biasanya melibatkan penulisan perangkat lunak frontend dan backend. Kode frontend hanya memanggil titik akhir API yang diekspos oleh backend, dan kode backend benar-benar berfungsi. Namun, dengan produk Firebase, backend tradisional dilewati, menempatkan pekerjaan ke klien. Ini secara teknis memungkinkan para insinyur front-end seperti saya untuk membangun aplikasi full-stack yang hanya menulis kode front-end.
Lebih banyak setelah melompat!Lanjutkan membaca di bawah ini
Intinya adalah bahwa Firebase akan bertindak sebagai backend kami dalam proyek ini dengan memberi kami titik akhir API yang diperlukan untuk menangani kebutuhan otentikasi dan database kami. Pada akhirnya, Anda telah membangun aplikasi survei fungsional menggunakan Vue+ Firebase. Setelah itu, Anda dapat melanjutkan dan membangun aplikasi web apa pun pilihan Anda menggunakan proses yang sama ini, bahkan dengan backend khusus.
Untuk mengikuti, Anda harus menginstal Node dan npm/yarn di mesin Anda. Jika Anda belum melakukannya, ikuti panduan cepat ini untuk memasang benang atau npm pada mesin Anda. Anda juga harus memiliki pemahaman dasar tentang sintaks router Vue, Vuex dan Vue untuk tutorial ini.
File starter untuk tutorial ini ada di sini, yang berisi file dasar untuk proyek ini, dan ini adalah repo untuk demo yang sudah selesai. Anda dapat mengkloning atau mengunduh repo dan menjalankan npm install di terminal Anda.
Setelah menginstal file starter, Anda akan melihat halaman selamat datang, yang memiliki opsi untuk mendaftar dan masuk. Setelah masuk, Anda dapat mengakses survei.
Ini menjelaskan bagaimana aplikasi survei kami akan berfungsi. (Pratinjau besar)
Jangan ragu untuk membuat proyek baru jika Anda ingin membangun proyek ini sepenuhnya sendiri, pastikan untuk menginstal Vuex, router Vue, Vuelidate dan axios ke dalam proyek Vue Anda. Jadi mari kita langsung masuk:
Pertama, kita memerlukan akun Firebase untuk menyiapkan proyek ini yang sangat mirip dengan membuat wadah untuk aplikasi kita, memberi kita akses ke database, berbagai cara autentikasi, hosting, dll. Langsung disiapkan setelah Anda ada di situs Firebase.
Laman landas tempat Anda dapat mendaftar dan memulai perjalanan Firebase Anda. (Pratinjau besar) Membuat proyek Firebase (Pratinjau besar)
Sekarang setelah kita memiliki proyek, hal berikutnya adalah menyiapkan sistem otentikasi dan database (database Realtime) di Firebase.
Klik pada opsi "otentikasi";
Siapkan “metode masuk” yang kita inginkan (dalam hal ini email/kata sandi).
Siapkan metode Auth email/sandi untuk proyek. (Pratinjau besar)
Klik pada "basis data".
Pilih "Database waktu nyata" dan salin tautan ini yang ada di atas.
Ini akan sangat berguna sebagai titik akhir API ketika kita ingin mengirim data ke database firebase kita.
Kami akan merujuk ke API ini sebagai API database. Untuk menggunakannya, Anda harus menambahkan nama database pilihan Anda saat mengirimnya. Misalnya, untuk mengirim ke database yang disebut pengguna. Anda cukup menambahkan user.json di akhir:
{databaseAPI}/user.json
Gunakan API di atas database itu sendiri untuk mengirim data ke database. (Pratinjau besar)
Setelah ini, kita akan pergi ke dokumentasi API Firebase auth rest untuk mendapatkan endpoint API sign up dan sign in. Dalam titik akhir ini, akan ada kebutuhan untuk kunci API proyek kami, yang dapat ditemukan di pengaturan proyek kami.
Validasi
Kembali ke kode kita, akan ada validasi data pendaftaran sebelum dikirim ke server, hanya untuk memastikan pengguna mengirimkan informasi yang sesuai. Kami akan menggunakan Vuelidate yang merupakan library keren yang membuat validasi lebih mudah di Vue. Pertama-tama, instal Vuelidate ke dalam proyek:
npm i vuelidate
Buka src/components/auth/signup.vue dan di dalam tag skrip, impor vuelidate dan semua peristiwa penting yang kita perlukan dari perpustakaan seperti yang terlihat di bawah ini.
Catatan : Anda dapat memeriksa dokumen untuk ikhtisar lengkap perpustakaan dan semua acara yang tersedia.
Nilai numerik terkecil yang dapat dimasukkan pengguna.
sameAs
Digunakan untuk membandingkan antara dua nilai untuk memastikan keduanya sama
Impor juga [`axios`](https://github.com/axios/axios) agar dapat mengirim permintaan HTTP ke server:
import axios from 'axios'
Sebelum kita melanjutkan, kita perlu menambahkan beberapa aturan ke database untuk dapat memvalidasi email sebagaimana mestinya, seperti yang terlihat di bawah ini: Aturan database membantu memutuskan Anda dapat atau tidak dapat mengakses database kapan saja. (Pratinjau besar)
"read" = "true"
Artinya database dapat dibaca tanpa hambatan dari sisi klien.
"write" = "auth" !== null
Anda tidak dapat menulis di database kecuali Anda adalah pengguna yang diautentikasi.
"Users" = { "onIndex" : ["email"] }
Ini memungkinkan kita untuk menanyakan dokumen `pengguna` dengan indeks `email`. Artinya, Anda benar-benar dapat memfilter database untuk email unik. Kemudian tambahkan properti terkomputasi kustom dengan nama `validations` sama seperti kita memiliki metode, computed, dll. Di bawah `validations` kita akan memiliki metode untuk memvalidasi data yang diperlukan mulai dari `email` yang diperlukan dan jelas harus berupa email . Selain itu, kami ingin dapat memberi tahu pengguna ketika email telah diambil oleh orang lain, dengan memeriksa database setelah pengguna mengetiknya menggunakan sesuatu yang disebut validator async semua dalam validator khusus dan semuanya didukung oleh [vuelidate. ](https://vuelidate.js.org/#sub-asynchronous-validation)
Kemudian di bawah unique, kueri database menggunakan axios dan gunakan Object.keys default untuk mengembalikan respons hanya jika panjangnya 0. Untuk usia, Anda akan menambahkan nilai wajib, numerik, dan minimal 18 yang ditetapkan ke `minVal ` sebagai propertinya.
age: { required, numeric, minVal: minValue(18) }
Properti kata sandi diperlukan, dengan panjang minimal 6 ditetapkan untuk `minLen`.
password: { required, minLen: minLength(6) }
Properti `confirmPassword` pada dasarnya harus sama dengan kata sandi.
Untuk memberi tahu pengguna bahwa email telah diambil, gunakan `v-if` untuk memeriksa apakah `unique` benar atau salah. Jika benar, berarti panjang Objek yang dikembalikan adalah 0, dan email masih dapat digunakan begitu juga sebaliknya. Dengan cara yang sama, Anda dapat memeriksa apakah input pengguna adalah email yang sebenarnya menggunakan `v-if`. Dan untuk semua div di sekitarnya pada input individual, kami akan menambahkan kelas invalid yang menjadi aktif setelah ada kesalahan pada input tersebut. Untuk mengikat peristiwa validasi ke setiap input dalam HTML, kami menggunakan [`$touch()`](https://vuelidate.js.org/#sub-without-v-model) seperti yang terlihat dengan `email ` di bawah.
<div class="input" :class="{invalid: $v.email.$error}"> <h6 v-if="!$v.email.email">Please provide a valid email address.</h6> <h6 v-if="!$v.email.unique">This email address has been taken.</h6> <input type="email" placeholder="Email" @blur="$v.email.$touch()" v-model="email"> </div>
`Age`, `password`, dan `confirmPassword` akan diikat ke input HTML mereka dengan cara yang sama seperti `email`. Dan kami akan menonaktifkan tombol 'Kirim' jika ada kesalahan pada salah satu input.
Berikut [contoh CodePen](https://codepen.io/atanda1/pen/Yzyqrjv) lengkap untuk bagian vuelidate ini. Vuelidate digunakan di sini untuk menentukan jenis data yang dikirim ke database. (Pratinjau besar) ## Otentikasi Aplikasi ini adalah SPA dan tidak memuat ulang seperti situs tradisional, jadi kami akan menggunakan Vuex, sebagai "sumber kebenaran" tunggal kami untuk memungkinkan setiap komponen dalam aplikasi kami mengetahui status otentikasi umum. Kami pergi ke file toko kami, dan membuat metode sign-in/sign-up dalam tindakan. Respons (`token` dan `userId`) yang diterima saat kami mengirim data pengguna, akan disimpan dalam status kami. Ini penting karena token akan digunakan untuk mengetahui apakah kita masih masuk atau tidak pada titik mana pun dalam aplikasi kita. `token`, `userId`, dan pengguna dibuat dalam status dengan nilai awal nol. Kami akan membahas pengguna lebih lama lagi, tetapi untuk saat ini, kami akan fokus pada dua yang pertama.
Untuk sign-up/sign-in, kita harus membuat tindakan individual untuk keduanya, di mana kita mengirim permintaan auth ke server. Setelah itu, respons kami (token dan userId) dari sign-up/sign-in dikomit ke authUser, dan disimpan di penyimpanan lokal.
Tapi inilah bagian yang sulit, apa yang akan kita lakukan dengan tindakan pendaftaran khususnya adalah hanya mengirim email dan kata sandi untuk didaftarkan di database otentikasi. Dalam arti sebenarnya, kami tidak memiliki akses untuk menggunakan data dalam basis data autentikasi ini, dan kami tidak mengirimkan data pendaftaran apa pun selain email/kata sandi. Jadi yang akan kita lakukan adalah membuat tindakan lain untuk mengirim data pendaftaran lengkap ke database lain. Dalam dokumen database terpisah ini, kita akan memiliki akses lengkap ke semua informasi yang kita pilih untuk disimpan di sana. Kami akan memanggil tindakan baru ini yang disebut `storeUser` Kami kemudian pergi ke tindakan pendaftaran kami dan mengirimkan seluruh objek yang berisi data pendaftaran kami ke database yang sekarang kami akses melalui `storeUser`. **Catatan:** Anda mungkin tidak ingin mengirim sandi pengguna Anda dengan `storeUser` ke database untuk alasan keamanan.
`storeUser` menambahkan kueri menggunakan token dan API basis data yang baru kami peroleh saat memposting ke basis data. Ini karena kami tidak dapat menulis ke database kami, kecuali kami diautentikasi dengan bukti kami (token). Itu aturan yang kami berikan pada Firebase di awal, ingat?
“write” = “auth” !== null
Kode lengkap untuk tindakan sign-up/sign-in ada di sini [di sini](https://codepen.io/atanda1/pen/mdePKqj). Kemudian kirim sign-up dan sign-in dari komponennya dalam metode `onSubmit` ke tindakan masing-masing di store.
## AuthGuard Ada kebutuhan AuthGuard untuk mencegah pengguna yang tidak masuk mendapatkan akses ke dasbor tempat mereka akan mengirim survei. Buka file rute dan impor toko kami.
import store from './store'
Di dalam rute, buka jalur dasbor dan tambahkan yang berikut:
Semua ini dilakukan untuk memeriksa apakah ada token di negara bagian, jika ya, kami memberikan akses ke dasbor dan sebaliknya. ## LogOut Untuk membuat opsi logout, kita akan menggunakan `clearAuth` yang telah kita buat sebelumnya di bawah `mutations` yang hanya menyetel `token` dan `userId` ke `null`. Kami sekarang membuat `logout` `action` baru, yang melakukan `clearAuth`, menghapus penyimpanan lokal dan menambahkan `router.replace('/')` untuk mengarahkan pengguna sepenuhnya.
Kami kemudian menambahkan `@click` ke tombol yang mengaktifkan metode `onLogout` seperti yang dapat kita lihat [di sini](https://codepen.io/atanda1/pen/jObqKNd).
<ul @click="onLogout">Log Out</ul>
## UI_State Sekarang setelah kita memberikan akses bersyarat ke dasbor, langkah selanjutnya adalah menghapusnya dari bilah navigasi, jadi hanya pengguna yang diautentikasi yang dapat melihatnya. Untuk melakukannya, kita akan menambahkan metode baru di bawah `getter` yang disebut `ifAuthenticated` yang memeriksa apakah token dalam status kita nol. Ketika ada token, itu menunjukkan bahwa pengguna diautentikasi dan kami ingin mereka melihat opsi dasbor survei di bilah navigasi.
Setelah itu, Anda kembali ke komponen header dan membuat metode `auth` di bawah computed, yang mengirimkan ke `isAuthenticated` kami di dalam `getter` yang baru saja kami buat di toko. Apa yang dilakukan adalah bahwa `isAuthenticated` akan mengembalikan false jika tidak ada token, yang berarti `auth` juga akan menjadi null dan sebaliknya.
Setelah ini, kami menambahkan `v-if` ke HTML kami untuk memeriksa apakah `auth` adalah nol atau tidak, menentukan apakah opsi itu akan ditampilkan di bilah navigasi.
- Anda akan menemukan kode lengkap bagian Status UI [di sini](https://codepen.io/atanda1/pen/QWjNxyo). Ada perubahan pada header berdasarkan status otentikasi pengguna. (Pratinjau besar)
Masuk Otomatis
Saat kami memuat ulang aplikasi kami, kami kehilangan data dan keluar, harus memulai dari awal. Ini karena token dan Id kami disimpan di Vuex, yang merupakan javascript, dan ini berarti aplikasi kami dimuat ulang dengan browser saat disegarkan.
Dan akhirnya, yang akan kita lakukan adalah mengambil token di dalam penyimpanan lokal kita. Dengan demikian, kita dapat memiliki token pengguna di browser terlepas dari kapan kita me-refresh jendela, dan memiliki metode login otomatis pengguna kita selama token masih valid.
Sebuah metode actions baru yang disebut AutoLogin dibuat, di mana kita akan mendapatkan token dan userId dari penyimpanan lokal, dan mengkomit data kita ke metode authUser dalam mutasi.
Kami kemudian pergi ke App.vue kami dan menulis metode yang created , yang akan mengirimkan autoLogin dari toko kami setiap kali aplikasi dimuat.
created () { this.$store.dispatch('AutoLogin') }
Ambil_Pengguna_Data
Kami ingin menyambut pengguna di dasbor dengan menampilkan nama pengguna. Jadi, tindakan lain yang disebut fetchUser dibuat yang pertama kali memeriksa apakah ada token seperti biasa. Kemudian, ia melanjutkan untuk mendapatkan email dari penyimpanan lokal dan menanyakan database seperti yang dilakukan sebelumnya dengan validasi email.
Ini mengembalikan objek yang berisi data pengguna yang awalnya dikirimkan saat mendaftar. Kami kemudian mengonversi objek ini menjadi array dan memasukkannya ke mutasi storeUser yang awalnya dibuat.
Kembali ke dasbor, kita membuat metode komputasi baru bernama name yang mengembalikan state.user.name hanya jika pengguna ada.
computed: { name () { return !this.$store.getters.user ? false : this.$store.getters.user.name } }, created () { this.$store.dispatch('fetchUser') } }
Dan kami juga akan menambahkan properti terkomputasi yang created untuk mengirimkan tindakan fetchUser setelah halaman dimuat. Kami kemudian menggunakan v-if dalam HTML kami untuk menampilkan nama jika nama itu ada.
<p v-if="name">Welcome, {{ name }} </p>
Kirim_Survei
Untuk mengirim survei, kami akan membuat tindakan postData yang mengirimkan data ke database menggunakan API database, dengan token untuk menunjukkan server bahwa pengguna login.
Itu dia, kami memiliki banyak fitur berguna yang diimplementasikan ke dalam aplikasi demo kami saat berkomunikasi dengan server Firebase kami. Mudah-mudahan, Anda akan menggunakan fitur canggih ini di proyek Anda berikutnya karena fitur tersebut sangat penting untuk membangun aplikasi web modern saat ini.
Jika Anda memiliki pertanyaan, Anda dapat meninggalkannya di bagian komentar dan saya akan dengan senang hati menjawabnya!
Demo untuk tutorialnya ada di sini.
Aplikasi survei yang telah selesai (Pratinjau besar)
Sumber daya lain yang mungkin terbukti bermanfaat meliputi:
Untuk memahami lebih lanjut tentang Firebase dan layanan lain yang ditawarkannya, lihat artikel Chris Esplin, “Apa itu Firebase?”
Vuelidate adalah perpustakaan yang sangat bagus yang harus Anda gali. Anda harus membaca dokumentasinya untuk mendapatkan wawasan penuh.https://vuelidate.js.org/.
Anda juga dapat menjelajahi aksio sendiri, terutama jika Anda ingin menggunakannya dalam proyek yang lebih besar.