Firebase Kimlik Doğrulaması ve Veritabanı Kullanarak Bir Vue Anketi Uygulaması Nasıl Oluşturulur
Firebase Kimlik Doğrulaması ve Veritabanı Kullanarak Bir Vue Anketi Uygulaması Nasıl Oluşturulur
Yayınlanan: 2022-03-10
Hızlı özet ↬ Bu eğitici, sizi Vue.js ve Firebase kullanarak işlevsel bir anket uygulaması oluşturmak için adım adım kılavuza götürecektir. Kullanıcı verilerini Vuelidate aracılığıyla doğrulamaktan kimlik doğrulamaya, kullanıcı verilerini depolamaya, rota korumasına ve Firebase sunucularına veri göndermeye kadar. Eğitimde kullanılan tüm adımlar pratiktir ve özel bir arka uçla bile gerçek hayattaki herhangi bir projede yeniden üretilebilir.
Bu eğitimde, kullanıcılarımızın form verilerini doğrulamayı, Vue'da Kimlik Doğrulamayı uygulamayı ve Vue ve Firebase (bir BaaS platformu) kullanarak anket verilerini alabilmeyi öğreneceğimiz bir Anket Uygulaması oluşturacaksınız.
Bu uygulamayı oluştururken, kullanıcı kayıt sırasında formu göndermeden önce bile, bir e-postanın alınıp alınmadığını kontrol etmek için arka uca ulaşmak da dahil olmak üzere farklı veri türleri için form doğrulamayı nasıl ele alacağımızı öğreneceğiz.
Ayrıca, uygulama, kullanıcının rahat API'lerle oturum açmasını yönetir. Oturum açmamış kullanıcıların anket formuna erişmesini önlemek ve oturum açmış kullanıcıların anket verilerini güvenli bir veritabanına başarıyla göndermek için Vue yönlendiricisinde Authguard'ı kullanır.
Aynı sayfada olmamız için, bu eğitimde Firebase'in ne olduğunu ve ne yapacağını açıklayalım. Firebase, "uygulamanızı oluşturmak, geliştirmek ve büyütmek" için bir araç setidir; geliştiricilerin normalde kendilerinin oluşturmak zorunda oldukları, ancak gerçekten oluşturmak istemedikleri hizmetlerin büyük bir kısmına erişmenizi sağlar. uygulama deneyiminin kendisine odaklanın. Bu, analitik, kimlik doğrulama, veritabanları, dosya depolama gibi şeyleri içerir ve liste uzayıp gider.
Bu, genellikle hem ön uç hem de arka uç yazılımı yazmayı içeren geleneksel uygulama geliştirmeden farklıdır. Ön uç kodu yalnızca arka uç tarafından açığa çıkarılan API uç noktalarını çağırır ve arka uç kodu aslında işi yapar. Ancak, Firebase ürünleriyle, geleneksel arka uç atlanır ve iş istemciye yüklenir. Bu teknik olarak benim gibi ön uç mühendislerinin yalnızca ön uç kodu yazarak tam yığın uygulamalar oluşturmasına olanak tanır.
Atlamadan sonra daha fazlası!Aşağıdan okumaya devam edin ↓
Sonuç olarak, Firebase, hem kimlik doğrulama hem de veritabanı ihtiyaçlarımızı karşılamak için bize gerekli API uç noktalarını sağlayarak bu projede arka ucumuz olarak hareket edecektir. Sonunda, Vue+ Firebase kullanarak işlevsel bir anket uygulaması oluşturmuş olacaksınız. Bundan sonra, özel bir arka uçla bile aynı işlemleri kullanarak istediğiniz herhangi bir web uygulamasını oluşturabilirsiniz.
Devam etmek için, makinenizde Node ve npm/yarn kurulu olmalıdır. Bunu henüz yapmadıysanız, makinenize iplik veya npm yüklemek için bu hızlı kılavuzları izleyin. Ayrıca bu eğitim için temel bir Vue, Vuex ve Vue yönlendirici sözdizimine sahip olmanız gerekir.
Bu eğitim için başlangıç dosyaları, bu proje için temel dosyaları içeren tam burada ve işte tamamlanmış demo için repo. Depoları klonlayabilir veya indirebilir ve terminalinizde npm install çalıştırabilirsiniz.
Başlangıç dosyasını yükledikten sonra, kaydolma ve oturum açma seçeneklerine sahip bir hoş geldiniz sayfası göreceksiniz. Oturum açtıktan sonra ankete erişebilirsiniz.
Bu projeyi tamamen kendi başınıza inşa etmek istiyorsanız, yeni bir proje oluşturmaktan çekinmeyin, Vue projenize Vuex, Vue yönlendirici, Vuelidate ve axios yüklediğinizden emin olun. O halde hemen atlayalım:
İlk olarak, uygulamamız için bir kapsayıcı oluşturmaya çok benzer olan bu projeyi kurmak için bir Firebase hesabına ihtiyacımız olacak, bize veritabanına erişim, çeşitli kimlik doğrulama araçları, barındırma vb. Firebase sitesinde.
Artık projemize sahip olduğumuza göre, sıradaki şey hem kimlik doğrulama sistemimizi hem de veritabanımızı (Gerçek Zamanlı veritabanı) Firebase'de kurmak.
“Kimlik doğrulama” seçeneğine tıklayın;
İstediğimiz "oturum açma yöntemini" ayarlayın (bu durumda e-posta/şifre).
"Veritabanı" üzerine tıklayın.
“Gerçek zamanlı veritabanı”nı seçin ve en üstte bulunan bu bağlantıyı kopyalayın.
Verileri firebase veritabanımıza göndermek istediğimizde API uç noktası olarak çok faydalı olacaktır.
Bu API'ye veritabanı API'si diyeceğiz. Bunu kullanmak için, gönderirken seçtiğiniz veritabanının adını eklemeniz gerekir. Örneğin, user adlı bir veritabanına göndermek için. En sona user.json eklemeniz yeterlidir:
{databaseAPI}/user.json
Bundan sonra, kaydolmamızı ve API uç noktalarında oturum açmamızı sağlamak için Firebase auth dinlenme API belgelerine gideceğiz. Bu uç noktalar içinde, proje ayarlarımızda bulunabilecek projemizin API anahtarına ihtiyaç duyulacaktır.
doğrulama
Kodumuza geri dönersek, yalnızca kullanıcının uygun bilgileri gönderdiğinden emin olmak için, sunucuya gönderilmeden önce kayıt verilerinin doğrulanması olacaktır. Vue'da doğrulamayı kolaylaştıran harika bir kitaplık olan Vuelidate'i kullanacağız. Her şeyden önce, projeye Vuelidate'i kurun:
npm i vuelidate
src/components/auth/signup.vue ve komut dosyası etiketi import vuelidate içinde ve aşağıda görüldüğü gibi kitaplıktan ihtiyaç duyacağımız tüm gerekli olaylar.
Not : Kitaplığa ve mevcut tüm etkinliklere tam bir genel bakış için belgelere göz atabilirsiniz.
Aynı olduklarından emin olmak için iki değeri karşılaştırmak için kullanılır
Ayrıca sunucuya bir HTTP isteği gönderebilmek için [`axios`](https://github.com/axios/axios) dosyasını içe aktarın:
import axios from 'axios'
Devam etmeden önce, aşağıda görüldüğü gibi, e-postayı gerektiği gibi doğrulayabilmek için veritabanına bazı kurallar eklememiz gerekecek:
"read" = "true"
Bu, veritabanının istemci tarafından herhangi bir engel olmaksızın okunabileceği anlamına gelir.
"write" = "auth" !== null
Kimliği doğrulanmış bir kullanıcı olmanız dışında veritabanına yazamazsınız.
"Users" = { "onIndex" : ["email"] }
Bu, "kullanıcılar" belgesini bir "e-posta" dizini ile sorgulamamızı sağlar. Yani, benzersiz bir e-posta için veritabanını tam anlamıyla filtreleyebilirsiniz. Ardından, tıpkı yöntemlerimiz, hesaplanmış, vb. gibi "doğrulamalar" adında özel bir hesaplanmış özellik ekleyin. "Doğrulamalar" altında, gerekli verileri doğrulamak için gerekli olan ve açıkça bir e-posta olması gereken "e-posta"dan başlayarak yöntemlerimiz olacak. . Ayrıca, bir başkası tarafından daha önce bir e-posta alındığında bir kullanıcıya, kullanıcı e-postayı yazdıktan sonra, tümü özel bir doğrulayıcı içinde zaman uyumsuz doğrulayıcılar adı verilen bir şey kullanarak veritabanını kontrol ederek söyleyebilmek istiyoruz ve tümü [vuelidate. ](https://vuelidate.js.org/#sub-asynchronous-validation)
Daha sonra benzersiz altında, veritabanını axios kullanarak sorgulayın ve yalnızca uzunluğu 0 ise yanıtı döndürmek için varsayılan Object.keys'i kullanın. Yaş için, gerekli, sayısal ve minVal'e atanan minimum 18 değerini ekleyeceksiniz. ` özellikleri olarak.
age: { required, numeric, minVal: minValue(18) }
Parolanın özellikleri gereklidir ve minimum uzunluk "minLen"e atanmıştır.
password: { required, minLen: minLength(6) }
`confirmPassword` özellikleri temel olarak şifre ile aynı olmalıdır.
Kullanıcıya e-postanın alındığını söylemek için, "benzersiz" ifadesinin doğru veya yanlış olup olmadığını kontrol etmek için "v-if" kullanın. Doğruysa, döndürülen Nesnenin uzunluğunun 0 olduğu anlamına gelir ve e-posta hala kullanılabilir ve bunun tersi de geçerlidir. Aynı şekilde, `v-if` kullanarak kullanıcı girişinin gerçek bir e-posta olup olmadığını kontrol edebilirsiniz. Ve bireysel girişteki tüm çevreleyen div'ler için, o girişte bir hata olduğunda aktif hale gelen bir geçersiz sınıfı ekleyeceğiz. Doğrulama olaylarını HTML'deki girişlerin her birine bağlamak için, "e-posta"da görüldüğü gibi [`$touch()`](https://vuelidate.js.org/#sub-without-v-model) kullanırız. `aşağıda.
<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" ve "confirmPassword", HTML girişlerine "e-posta" ile benzer şekilde bağlanacaktır. Girişlerden herhangi birinde bir hata varsa, 'Gönder' düğmesini devre dışı bırakacağız.
İşte bu vuelidate bölümü için eksiksiz bir [CodePen örneği](https://codepen.io/atanda1/pen/Yzyqrjv). ## Kimlik Doğrulama Bu uygulama bir SPA'dır ve geleneksel siteler gibi yeniden yüklenmez, bu nedenle uygulamamızdaki her bileşenin genel kimlik doğrulama durumunun farkında olmasını sağlamak için tek "doğruluk kaynağımız" olarak Vuex'i kullanacağız. Mağaza dosyamıza gidiyoruz ve eylemler içinde hem oturum açma/kaydolma yöntemini oluşturuyoruz. Kullanıcı verilerini gönderdiğimizde alınan yanıt ('token' ve 'userId') durumumuz içinde saklanacaktır. Bu önemlidir çünkü jeton, uygulamamızın herhangi bir noktasında hala giriş yapıp yapmadığımızı bilmek için kullanılacaktır. "token", "userId" ve kullanıcı, boş bir başlangıç değeriyle durumda oluşturulur. Kullanıcıya çok sonra geleceğiz, ancak şimdilik ilk ikisine odaklanacağız.
Kaydolma/oturum açma için, auth isteklerimizi sunucuya gönderdiğimiz her ikisi için de bireysel eylemler oluşturmamız gerekecek. Bundan sonra, kaydolma/oturum açma sırasındaki yanıtımız (belirteç ve kullanıcı kimliği) authUser'a taahhüt edilir ve yerel depolamaya kaydedilir.
Ancak burada işin zor yanı, kayıt işlemiyle özellikle yapacağımız şey, yalnızca kimlik doğrulama veritabanına kaydedilecek e-posta ve parolayı göndermektir. Gerçek anlamda, bu kimlik doğrulama veritabanındaki verileri kullanma erişimimiz yok ve e-posta/şifre dışında herhangi bir kayıt verimizi göndermedik. Yani yapacağımız şey, kayıt verilerinin tamamını başka bir veritabanına göndermek için başka bir eylem oluşturmak. Bu ayrı veritabanı belgesinde, oraya kaydetmeyi seçtiğimiz tüm bilgilere tam erişimimiz olacak. Bu yeni eyleme 'storeUser' adını vereceğiz. Daha sonra kayıt eylemimize gidiyoruz ve kayıt verilerimizi içeren tüm nesneyi artık 'storeUser' aracılığıyla erişimimiz olan bir veritabanına gönderiyoruz. **Not:** Güvenlik nedeniyle kullanıcınızın şifresini `storeUser` ile veritabanına göndermek istemeyebilirsiniz.
`storeUser`, veritabanına gönderirken yeni alınan jetonumuzu ve veritabanı API'mizi kullanarak bir sorgu ekler. Bunun nedeni, kanıtımızla (belirteç) kimliğimiz doğrulanmadıkça veritabanımıza yazamıyor olmamızdır. Firebase'e başlangıçta verdiğimiz kural buydu, hatırladın mı?
“write” = “auth” !== null
Kaydolma/oturum açma işlemleri için tam kod [burada](https://codepen.io/atanda1/pen/mdePKqj). Ardından, "onSubmit" yöntemi içindeki bileşenlerinden hem kaydolma hem de oturum açma işlemlerini mağazadaki ilgili eylemlere gönderin.
## AuthGuard Oturum açmamış kullanıcıların anketi gönderecekleri kontrol paneline erişmelerini önlemek için AuthGuard'a ihtiyaç vardır. Rota dosyasına gidin ve mağazamızı içe aktarın.
import store from './store'
Rota içinde, kontrol panelinin yoluna gidin ve aşağıdakileri ekleyin:
Tüm bunlar, durumda bir belirteç olup olmadığını kontrol etmektir, evet ise, gösterge panosuna erişim sağlarız ve bunun tersi de geçerlidir. ## Oturumu Kapat Oturum kapatma seçeneğimizi oluşturmak için, daha önce "mutasyonlar" altında oluşturduğumuz "clearAuth"u kullanacağız ve bu, hem "token"ı hem de "userId"yi "boş"a ayarlayacaktır. Şimdi, 'clearAuth', yerel depolamayı silme ve kullanıcıyı tamamen yeniden yönlendirmek için 'router.replace('/')' eklemeyi taahhüt eden yeni bir 'logout' 'action' oluşturuyoruz.
Ardından, [burada](https://codepen.io/atanda1/pen/jObqKNd) görebildiğimiz gibi 'onLogout' yöntemini başlatan düğmeye bir '@click' ekleriz.
<ul @click="onLogout">Log Out</ul>
## UI_State Gösterge tablosuna koşullu erişim verdiğimize göre, sonraki adım onu gezinme çubuğundan kaldırmaktır, böylece yalnızca kimliği doğrulanmış kullanıcılar görebilir. Bunu yapmak için, durumumuzdaki belirtecin boş olup olmadığını kontrol eden 'ifAuthenticated' adlı 'alıcılar'ın altına yeni bir yöntem eklerdik. Bir belirteç olduğunda, kullanıcının kimliğinin doğrulandığını ve gezinme çubuğunda anket panosu seçeneğini görmelerini istediğimizi gösterir.
Bundan sonra, başlık bileşenine geri dönersiniz ve hesaplanan altında bir 'auth' yöntemi yaratırsınız, bu da mağazada yeni oluşturduğumuz 'alıcılar' içindeki 'isAuthenticated'ımıza gönderilir. Bunun yaptığı şey, belirteç yoksa "isAuthenticated"ın false döndürmesidir; bu, "auth" öğesinin de boş olacağı anlamına gelir ve bunun tersi de geçerlidir.
Bundan sonra, 'auth' öğesinin boş olup olmadığını kontrol etmek için HTML'mize bir 'v-if' ekleriz ve bu seçeneğin gezinme çubuğunda gösterilip gösterilmeyeceğini belirleriz.
- Kullanıcı Arayüzü Durumu bölümünün tam kodunu [burada](https://codepen.io/atanda1/pen/QWjNxyo) bulabilirsiniz.
Otomatik giriş
Uygulamamızı yeniden yüklediğimizde verileri kaybederiz ve her şeye yeniden başlamak zorunda kaldığımız için çıkış yaparız. Bunun nedeni, simgemizin ve kimliğimizin javascript olan Vuex'te saklanması ve bu, uygulamamızın yenilendiğinde tarayıcıyla yeniden yükleneceği anlamına gelir.
Ve son olarak, yapacağımız şey, yerel depomuzdaki belirteci almaktır. Bunu yaparak, pencereyi ne zaman yenilediğimizden bağımsız olarak tarayıcıda kullanıcının jetonunu alabiliriz ve jeton hala geçerli olduğu sürece kullanıcımızda otomatik olarak oturum açma yöntemine sahip olabiliriz.
Yerel depolamadan belirteci ve userId alacağımız ve verilerimizi mutasyonlarda authUser yöntemine işleyeceğimiz AutoLogin adlı yeni bir actions yöntemi oluşturulur.
Daha sonra App.vue'ya gidiyoruz ve uygulama her yüklendiğinde mağazamızdan autoLogin gönderecek created bir yöntem yazıyoruz.
created () { this.$store.dispatch('AutoLogin') }
Fetch_User_Data
Kullanıcının adını görüntüleyerek kullanıcıyı gösterge tablosunda karşılamak istiyoruz. Ve böylece, her zamanki gibi bir belirteç olup olmadığını ilk önce kontrol eden fetchUser adlı başka bir eylem oluşturulur. Ardından, e-postayı yerel depolamadan almaya devam eder ve e-posta doğrulamasıyla daha önce yapıldığı gibi veritabanını sorgular.
Bu, kayıt sırasında başlangıçta gönderilen kullanıcının verilerini içeren bir nesne döndürür. Daha sonra bu nesneyi bir diziye dönüştürüyoruz ve başlangıçta oluşturulan storeUser mutasyonuna bağlıyoruz.
Panoya geri dönersek, yalnızca kullanıcı varsa state.user.name döndüren name adında yeni bir hesaplanmış yöntem oluşturuyoruz.
computed: { name () { return !this.$store.getters.user ? false : this.$store.getters.user.name } }, created () { this.$store.dispatch('fetchUser') } }
Ayrıca, sayfa yüklendikten sonra fetchUser eylemini göndermek için created hesaplanmış özelliği ekleyeceğiz. Daha sonra, ad varsa, adı görüntülemek için HTML'mizde v-if if'i kullanırız.
<p v-if="name">Welcome, {{ name }} </p>
Send_Survey
Anketi göndermek için, sunucuya kullanıcının oturum açtığını göstermek için belirteçle birlikte, veritabanı API'sini kullanarak verileri veritabanına gönderen bir postData eylemi oluşturacağız.
İşte elimizde, Firebase sunucumuzla iletişim kurarken demo uygulamamıza uygulanan birçok faydalı özelliğimiz var. Bugün modern web uygulamaları oluşturmak için çok önemli olduklarından, bir sonraki projenizde bu güçlü özellikleri kullanacağınızı umuyoruz.
Herhangi bir sorunuz varsa, bunları yorum bölümünde bırakabilirsiniz, her birine cevap vermekten mutluluk duyacağım!
Eğitimin demosu burada yayında.
Yararlı olabilecek diğer kaynaklar şunları içerir:
Firebase ve sunduğu diğer hizmetler hakkında daha fazla bilgi edinmek için Chris Esplin'in “Firebase Nedir?” başlıklı makalesine göz atın.
Vuelidate, gerçekten incelemeniz gereken gerçekten güzel bir kütüphanedir. Tam bilgi edinmek için belgelerini okumalısınız.https://vuelidate.js.org/.
Özellikle daha büyük projelerde kullanmak istiyorsanız, axios'u kendi başına da keşfedebilirsiniz.