So erstellen Sie eine Vue-Umfrage-App mit Firebase-Authentifizierung und -Datenbank
So erstellen Sie eine Vue-Umfrage-App mit Firebase-Authentifizierung und -Datenbank
Veröffentlicht: 2022-03-10
Kurze Zusammenfassung ↬ Dieses Tutorial führt Sie Schritt für Schritt durch die Erstellung einer funktionalen Umfrage-App mit Vue.js und Firebase. Von der Validierung der Benutzerdaten durch Vuelidate über die Authentifizierung bis hin zur Speicherung der Benutzerdaten, dem Routenschutz und dem Senden von Daten an Firebase-Server. Alle im Tutorial verwendeten Schritte sind praktisch und können in jedem realen Projekt reproduziert werden, sogar mit einem benutzerdefinierten Backend.
In diesem Tutorial erstellen Sie eine Umfrage-App, in der wir lernen, die Formulardaten unserer Benutzer zu validieren, die Authentifizierung in Vue zu implementieren und Umfragedaten mit Vue und Firebase (einer BaaS-Plattform) zu erhalten.
Während wir diese App erstellen, lernen wir, wie die Formularvalidierung für verschiedene Arten von Daten gehandhabt wird, einschließlich der Kontaktaufnahme mit dem Backend, um zu überprüfen, ob eine E-Mail bereits vergeben ist, noch bevor der Benutzer das Formular während der Anmeldung absendet.
Außerdem würde die App die Anmeldung des Benutzers mit Restful-APIs handhaben. Es verwendet Authguard im Vue-Router, um zu verhindern, dass Benutzer, die nicht angemeldet sind, Zugriff auf das Umfrageformular erhalten, und sendet die Umfragedaten von angemeldeten Benutzern erfolgreich an eine sichere Datenbank.
Nur damit wir auf der gleichen Seite sind, lassen Sie uns in diesem Tutorial klären, was Firebase ist und was es tun wird. Firebase ist ein Toolset zum „Erstellen, Verbessern und Erweitern Ihrer App“. Es gibt Ihnen Zugriff auf einen großen Teil der Dienste, die Entwickler normalerweise selbst erstellen müssten, aber nicht wirklich erstellen möchten, weil sie es lieber tun würden Konzentrieren Sie sich auf das App-Erlebnis selbst. Dazu gehören Dinge wie Analysen, Authentifizierung, Datenbanken, Dateispeicherung und die Liste geht weiter.
Dies unterscheidet sich von der traditionellen App-Entwicklung, bei der normalerweise sowohl Frontend- als auch Backend-Software geschrieben wird. Der Frontend-Code ruft nur API-Endpunkte auf, die vom Backend verfügbar gemacht werden, und der Backend-Code erledigt die eigentliche Arbeit. Bei Firebase-Produkten wird das herkömmliche Backend jedoch umgangen, sodass die Arbeit dem Client übertragen wird. Technisch gesehen ermöglicht dies Front-End-Ingenieuren wie mir, Full-Stack-Anwendungen zu erstellen, die nur Front-End-Code schreiben.
Mehr nach dem Sprung!Lesen Sie unten weiter ↓
Unter dem Strich würde Firebase in diesem Projekt als unser Backend fungieren, indem es uns die notwendigen API-Endpunkte zur Verfügung stellt, um sowohl unsere Authentifizierungs- als auch unsere Datenbankanforderungen zu erfüllen. Am Ende haben Sie mit Vue+ Firebase eine funktionierende Umfrage-App erstellt. Danach können Sie mit denselben Prozessen eine beliebige Webanwendung Ihrer Wahl erstellen, sogar mit einem benutzerdefinierten Backend.
Um mitzumachen, müssen Sie Node und npm/yarn auf Ihrem Computer installiert haben. Wenn Sie dies noch nicht getan haben, befolgen Sie diese Kurzanleitungen, um Garn oder npm auf Ihrer Maschine zu installieren. Für dieses Tutorial benötigen Sie außerdem ein grundlegendes Verständnis der Vue-, Vuex- und Vue-Router-Syntax.
Die Starterdateien für dieses Tutorial befinden sich hier, die die Basisdateien für dieses Projekt enthalten, und hier ist das Repo für die fertige Demo. Sie können die Repos klonen oder herunterladen und npm install in Ihrem Terminal ausführen.
Nach der Installation der Starterdatei sehen Sie eine Willkommensseite, auf der Sie sich registrieren und anmelden können. Nachdem Sie sich angemeldet haben, können Sie auf die Umfrage zugreifen.
Fühlen Sie sich frei, ein neues Projekt zu erstellen, wenn Sie dieses Projekt vollständig selbst erstellen möchten, stellen Sie einfach sicher, dass Sie Vuex, Vue Router, Vuelidate und Axios in Ihrem Vue-Projekt installieren. Also lass uns gleich einsteigen:
Zunächst benötigen wir ein Firebase-Konto, um dieses Projekt einzurichten, was dem Erstellen eines Containers für unsere App sehr ähnlich ist und uns Zugriff auf die Datenbank, verschiedene Authentifizierungsmethoden, Hosting usw. gewährt. Es ist einfach einzurichten, sobald Sie es einmal getan haben sind auf der Firebase-Website.
Jetzt, da wir unser Projekt haben, müssen wir als nächstes sowohl unser Authentifizierungssystem als auch unsere Datenbank (Echtzeitdatenbank) auf Firebase einrichten.
Klicken Sie auf die Option „Authentifizierung“;
Richten Sie die gewünschte „Anmeldemethode“ ein (in diesem Fall E-Mail/Passwort).
Klicken Sie auf „Datenbank“.
Wählen Sie „Echtzeitdatenbank“ und kopieren Sie diesen Link ganz oben.
Es wird als API-Endpunkt sehr nützlich sein, wenn wir die Daten an unsere Firebase-Datenbank senden möchten.
Wir bezeichnen diese API als Datenbank-API. Um es zu verwenden, müssen Sie beim Senden den Namen der Datenbank Ihrer Wahl hinzufügen. Zum Beispiel, um an eine Datenbank namens user zu senden. Sie fügen einfach user.json am Ende hinzu:
{databaseAPI}/user.json
Danach gehen wir zur Firebase Auth Rest API-Dokumentation, um unsere Registrierungs- und Anmelde-API-Endpunkte zu erhalten. Innerhalb dieser Endpunkte wird der API-Schlüssel unseres Projekts benötigt, den Sie in unseren Projekteinstellungen finden.
Validierung
Zurück zu unserem Code, es gibt eine Validierung der Anmeldedaten, bevor sie an den Server gesendet werden, nur um sicherzustellen, dass der Benutzer die richtigen Informationen sendet. Wir verwenden Vuelidate, eine coole Bibliothek, die die Validierung in Vue vereinfacht. Installieren Sie zunächst Vuelidate im Projekt:
npm i vuelidate
Gehen Sie zu src/components/auth/signup.vue und importieren Sie innerhalb des script-Tags vuelidate und alle erforderlichen Ereignisse, die wir aus der Bibliothek benötigen, wie unten gezeigt.
Hinweis : In den Dokumenten finden Sie einen vollständigen Überblick über die Bibliothek und alle verfügbaren Veranstaltungen.
Kleinster numerischer Wert, den der Benutzer eingeben kann.
sameAs
Wird verwendet, um zwei Werte zu vergleichen, um sicherzustellen, dass sie gleich sind
Importieren Sie auch [`axios`](https://github.com/axios/axios), um eine HTTP-Anfrage an den Server senden zu können:
import axios from 'axios'
Bevor wir fortfahren, müssen wir der Datenbank einige Regeln hinzufügen, um die E-Mail ordnungsgemäß validieren zu können, wie unten gezeigt:
"read" = "true"
Das bedeutet, dass die Datenbank von der Client-Seite ungehindert gelesen werden kann.
"write" = "auth" !== null
Sie können nicht in die Datenbank schreiben, es sei denn, Sie sind ein authentifizierter Benutzer.
"Users" = { "onIndex" : ["email"] }
Dies ermöglicht es uns, das Dokument „Benutzer“ mit einem Index von „E-Mail“ abzufragen. Das heißt, Sie können die Datenbank buchstäblich nach einer eindeutigen E-Mail filtern. Fügen Sie dann eine benutzerdefinierte berechnete Eigenschaft mit dem Namen "validations" hinzu, genau wie wir Methoden, berechnet usw. haben. Unter "validations" haben wir Methoden, um die erforderlichen Daten zu validieren, beginnend mit "email", wo es erforderlich ist und offensichtlich eine E-Mail sein muss . Außerdem möchten wir in der Lage sein, einem Benutzer mitzuteilen, wenn eine E-Mail bereits von jemand anderem entgegengenommen wurde, indem wir die Datenbank überprüfen, nachdem der Benutzer sie eingegeben hat, indem wir so genannte asynchrone Validatoren innerhalb eines benutzerdefinierten Validators verwenden und alles von [vuelidate. ](https://vuelidate.js.org/#sub-asynchronous-validation)
Fragen Sie dann unter Unique die Datenbank mit Axios ab und verwenden Sie die standardmäßigen Object.keys, um die Antwort nur zurückzugeben, wenn ihre Länge 0 ist. Für das Alter fügen Sie den erforderlichen, numerischen Wert und einen Mindestwert von 18 hinzu, der `minVal zugewiesen wird ` als seine Eigenschaften.
age: { required, numeric, minVal: minValue(18) }
Die Eigenschaften des Passworts sind erforderlich, wobei "minLen" eine Mindestlänge von 6 zugewiesen wird.
password: { required, minLen: minLength(6) }
`confirmPassword`-Eigenschaften müssen grundsätzlich die gleichen wie das Passwort sein.
Um dem Benutzer mitzuteilen, dass die E-Mail vergeben ist, verwenden Sie „v-if“, um zu prüfen, ob „unique“ wahr oder falsch ist. Wenn wahr, bedeutet dies, dass die Länge des zurückgegebenen Objekts 0 ist und E-Mail weiterhin verwendet werden kann und umgekehrt. Auf die gleiche Weise können Sie mit `v-if` überprüfen, ob die Benutzereingabe eine echte E-Mail ist. Und für alle umgebenden divs auf der einzelnen Eingabe fügen wir eine ungültige Klasse hinzu, die aktiv wird, sobald ein Fehler an dieser Eingabe auftritt. Um die Validierungsereignisse an jede der Eingaben im HTML zu binden, verwenden wir [`$touch()`](https://vuelidate.js.org/#sub-without-v-model), wie bei der `email ` unten.
<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>
„Alter“, „Passwort“ und „Passwort bestätigen“ werden auf ähnliche Weise wie „E-Mail“ an ihre HTML-Eingabe gebunden. Und wir deaktivieren die Schaltfläche "Senden", wenn in einer der Eingaben ein Fehler auftritt.
Hier ist ein vollständiges [CodePen-Beispiel](https://codepen.io/atanda1/pen/Yzyqrjv) für diesen vuelidate-Abschnitt. ## Authentifizierung Diese App ist ein SPA und wird nicht wie herkömmliche Websites neu geladen, daher verwenden wir Vuex als unsere einzige „Quelle der Wahrheit“, damit jede Komponente in unserer App den allgemeinen Authentifizierungsstatus kennt. Wir gehen zu unserer Store-Datei und erstellen sowohl die Anmelde- als auch die Anmeldemethode innerhalb von Aktionen. Die Antwort (`token` und `userId`), die wir erhalten, wenn wir die Benutzerdaten senden, wird in unserem Zustand gespeichert. Dies ist wichtig, da das Token verwendet wird, um zu wissen, ob wir zu irgendeinem Zeitpunkt in unserer App noch angemeldet sind oder nicht. Das „Token“, die „userId“ und der Benutzer werden im Status mit einem Anfangswert von null erstellt. Wir kommen viel später zum Benutzer, aber jetzt konzentrieren wir uns auf die ersten beiden.
Für die Anmeldung/Anmeldung müssen wir für beide individuelle Aktionen erstellen, bei denen wir unsere Authentifizierungsanfragen an den Server senden. Danach wird unsere Antwort (Token und Benutzer-ID) von der Registrierung/Anmeldung an authUser übergeben und im lokalen Speicher gespeichert.
Aber hier ist der knifflige Teil, was wir bei der Anmeldeaktion tun werden, ist insbesondere, nur die E-Mail-Adresse und das Passwort zu senden, die in der Authentifizierungsdatenbank registriert werden sollen. Im eigentlichen Sinne haben wir keinen Zugriff auf die Daten in dieser Authentifizierungsdatenbank, und wir haben außer E-Mail/Passwort keine unserer Anmeldedaten gesendet. Wir erstellen also eine weitere Aktion, um die vollständigen Anmeldedaten an eine andere Datenbank zu senden. In diesem separaten Datenbankdokument haben wir vollständigen Zugriff auf alle Informationen, die wir dort speichern. Wir nennen diese neue Aktion "storeUser". Wir gehen dann zu unserer Anmeldeaktion und senden das gesamte Objekt, das unsere Anmeldedaten enthält, an eine Datenbank, auf die wir jetzt über "storeUser" zugreifen können. **Hinweis:** Aus Sicherheitsgründen möchten Sie Ihr Benutzerpasswort möglicherweise nicht mit `storeUser` an die Datenbank senden.
„storeUser“ fügt eine Abfrage hinzu, die unser neu erhaltenes Token und die Datenbank-API verwendet, während es in die Datenbank postet. Dies liegt daran, dass wir nicht in unsere Datenbank schreiben können, es sei denn, wir werden mit unserem Beweis (dem Token) authentifiziert. Das ist die Regel, die wir Firebase am Anfang gegeben haben, erinnerst du dich?
“write” = “auth” !== null
Den vollständigen Code für Registrierungs-/Anmeldeaktionen finden Sie [hier](https://codepen.io/atanda1/pen/mdePKqj). Senden Sie dann sowohl die Registrierung als auch die Anmeldung von ihren Komponenten innerhalb der Methode "onSubmit" an die entsprechenden Aktionen im Geschäft.
## AuthGuard AuthGuard ist erforderlich, um zu verhindern, dass Benutzer, die nicht angemeldet sind, Zugriff auf das Dashboard erhalten, an das sie die Umfrage senden. Gehen Sie zur Routendatei und importieren Sie unseren Shop.
import store from './store'
Wechseln Sie innerhalb der Route zum Pfad des Dashboards und fügen Sie Folgendes hinzu:
Alles, was dies tut, ist zu prüfen, ob es ein Token im Zustand gibt, wenn ja, geben wir Zugriff auf das Dashboard und umgekehrt. ## LogOut Um unsere Logout-Option zu erstellen, verwenden wir `clearAuth`, das wir zuvor unter `Mutationen` erstellt haben, das einfach sowohl das `Token` als auch die `userId` auf `null` setzt. Wir erstellen jetzt eine neue „Logout“-„Aktion“, die sich auf „clearAuth“ festlegt, den lokalen Speicher löscht und „router.replace(‘/‘)“ hinzufügt, um den Benutzer vollständig umzuleiten.
Wir fügen dann ein `@click` zu der Schaltfläche hinzu, die die `onLogout`-Methode auslöst, wie wir [hier](https://codepen.io/atanda1/pen/jObqKNd) sehen können.
<ul @click="onLogout">Log Out</ul>
## UI_State Nachdem wir nun bedingten Zugriff auf das Dashboard gewährt haben, besteht der nächste Schritt darin, es aus der Navigationsleiste zu entfernen, sodass nur authentifizierte Benutzer es anzeigen können. Dazu würden wir unter den „Gettern“ eine neue Methode namens „ifAuthenticated“ hinzufügen, die prüft, ob das Token in unserem Zustand null ist. Wenn ein Token vorhanden ist, zeigt dies an, dass der Benutzer authentifiziert ist, und wir möchten, dass er die Umfrage-Dashboard-Option in der Navigationsleiste sieht.
Danach kehren Sie zur Header-Komponente zurück und erstellen eine Methode „auth“ unter „computed“, die an unser „isAuthenticated“ innerhalb der „Getter“ sendet, die wir gerade im Store erstellt haben. Dies bewirkt, dass "isAuthenticated" falsch zurückgeben würde, wenn kein Token vorhanden ist, was bedeutet, dass "auth" ebenfalls null wäre und umgekehrt.
Danach fügen wir unserem HTML ein „v-if“ hinzu, um zu prüfen, ob „auth“ null ist oder nicht, um zu bestimmen, ob diese Option in der Navigationsleiste angezeigt wird.
- Sie finden den vollständigen Code des Abschnitts UI-Status [hier](https://codepen.io/atanda1/pen/QWjNxyo).
Automatische Anmeldung
Wenn wir unsere App neu laden, verlieren wir die Daten und werden abgemeldet, sodass wir von vorne beginnen müssen. Dies liegt daran, dass unser Token und unsere ID in Vuex gespeichert sind, was Javascript ist, und dies bedeutet, dass unsere App beim Aktualisieren mit dem Browser neu geladen wird.
Und schließlich werden wir das Token in unserem lokalen Speicher abrufen. Auf diese Weise können wir das Token des Benutzers im Browser haben, unabhängig davon, wann wir das Fenster aktualisieren, und eine Methode haben, die unseren Benutzer automatisch anmeldet, solange das Token noch gültig ist.
Eine neue AutoLoginactions erstellt, bei der wir das Token und die Benutzer- userId aus dem lokalen Speicher abrufen und unsere Daten an die Methode authUser in den Mutationen übergeben.
Wir gehen dann zu unserem App.vue und schreiben eine created Methode, die das autoLogin jedes Mal, wenn die App geladen wird, aus unserem Store sendet.
created () { this.$store.dispatch('AutoLogin') }
Fetch_User_Data
Wir möchten den Benutzer auf dem Dashboard begrüßen, indem wir den Namen des Benutzers anzeigen. Und so wird eine weitere Aktion namens fetchUser erstellt, die zunächst wie gewohnt prüft, ob ein Token vorhanden ist. Anschließend holt es die E-Mail aus dem lokalen Speicher und fragt die Datenbank wie zuvor bei der E-Mail-Validierung ab.
Dies gibt ein Objekt zurück, das die Daten des Benutzers enthält, die ursprünglich während der Anmeldung übermittelt wurden. Wir konvertieren dieses Objekt dann in ein Array und übergeben es an die ursprünglich erstellte storeUser Mutation.
Zurück zum Dashboard erstellen wir eine neue berechnete Methode namens name , die state.user.name nur zurückgibt, wenn der Benutzer existiert.
computed: { name () { return !this.$store.getters.user ? false : this.$store.getters.user.name } }, created () { this.$store.dispatch('fetchUser') } }
Außerdem fügen wir die created berechnete Eigenschaft hinzu, um die Aktion fetchUser , sobald die Seite geladen ist. Wir verwenden dann das v-if in unserem HTML, um den Namen anzuzeigen, falls der Name existiert.
<p v-if="name">Welcome, {{ name }} </p>
Send_Umfrage
Um die Umfrage zu senden, erstellen wir eine postData Aktion, die die Daten mithilfe der Datenbank-API mit dem Token an die Datenbank sendet, um dem Server anzuzeigen, dass der Benutzer angemeldet ist.
Da haben wir es, wir haben viele nützliche Funktionen in unsere Demoanwendung implementiert, während wir mit unserem Firebase-Server kommunizieren. Hoffentlich verwenden Sie diese leistungsstarken Funktionen in Ihrem nächsten Projekt, da sie heute für die Erstellung moderner Web-Apps sehr wichtig sind.
Wenn Sie Fragen haben, können Sie diese im Kommentarbereich hinterlassen, und ich beantworte gerne jede einzelne davon!
Die Demo für das Tutorial ist hier live.
Andere Ressourcen, die sich als nützlich erweisen können, sind:
Weitere Informationen zu Firebase und den anderen angebotenen Diensten finden Sie in Chris Esplins Artikel „Was ist Firebase?“.
Vuelidate ist eine wirklich schöne Bibliothek, in die Sie sich wirklich einarbeiten sollten. Sie sollten die Dokumentation durchlesen, um einen vollständigen Einblick zu erhalten. https://vuelidate.js.org/.
Sie können Axios auch alleine erkunden, besonders wenn Sie es in größeren Projekten verwenden möchten.