本次要跟姊姊一起學習Vue 3 + Firebase Authentication 信箱註冊登入登出功能
▶ 如果您尚未建立專案/安裝 Firebase JS SDK 並初始化 Firebase,請先到昨日系列設定
開箱23:Vue 3 + 建立web應用程式+Firebase JS SDK 初始化
▶ 若需要跳出的通知視窗,可參考
開箱15:輕鬆套用訊息通知UI~Vue 3 Toastify範例應用
今日步驟
參考 Vue 3 + Firebase Authentication in 10 Minutes
https://www.youtube.com/watch?v=xceR7mrrXsA&ab_channel=LearnVue
官方文件:
認識 Firebase Authentication
https://firebase.google.com/docs/auth?hl=en
開始在網站上(web)使用 Firebase 身份驗證
https://firebase.google.com/docs/auth/web/start?hl=zh-tw
請先到昨日系列設定
開箱23:Vue 3 + 建立web應用程式+Firebase JS SDK 初始化
開始實作本次功能吧!
▲ 成果
Demo網址:https://hahasister-ironman-project.netlify.app/#/signUp
登入測試 email:12345678@yahoo.com.tw 密碼:123456
版本 "firebase": "^10.4.0"
☆★☆★ 詳細程式碼 前往 >> 本次程式 commit 紀錄
-使用者可登入
-使用者可登出
-使用者可註冊
-若進去SuccessSign.vue會判斷是否有登入過,若無登入過則跳到登入頁
本篇新增以下頁面
結構
project-root/
├─ src/
│ ├─ views/
│ │ ├─ SignIn.vue // 登入頁面
│ │ ├─ SignUp.vue // 註冊頁面
│ │ ├─ SuccessSign.vue // 只有登入才能看到的頁面,以及登入成功後前往的頁面
│ │
│ ├─ services/
│ │ ├─ firebase.js // 引入
│ │
│ ├─ router/
│ │ ├─ index.js
│ │
│ ├─ App.vue
│ ├─ main.js
└─ ...
Firebase Authentication 是 Firebase 提供的身份驗證服務,用於管理應用程式的使用者身份識別和授權。以下是 Firebase Authentication 服務提供的一些主要功能和選項:
電子郵件和密碼驗證:使用者可以使用電子郵件地址和密碼註冊、登錄和重設密碼。
社交媒體身份驗證:Firebase Authentication 支援多種社交媒體平台,例如 Google、Facebook、Twitter、GitHub 等,用戶可以使用這些平台的帳戶進行快速註冊和登錄。
電話號碼驗證:Firebase 提供了電話號碼驗證選項,允許用戶通過簡訊驗證碼來註冊和登錄。
自訂令牌驗證:您可以使用 Firebase Authentication 來實現自訂令牌驗證,以支援自己的身份驗證方式。
多因素身份驗證(MFA):Firebase 支援多因素身份驗證,以增強應用程式的安全性,例如使用 OTP(一次性密碼)或硬件安全密鑰。
匿名身份驗證:用戶可以選擇匿名註冊,無需提供任何個人資訊,但可以隨後將帳戶連結到其他身份驗證方式。
自訂使用者屬性:您可以存儲和管理用戶的自訂屬性,以擴展用戶的概要資訊。
密碼重設:用戶可以要求重設密碼,並通過電子郵件驗證來完成該過程。
密碼策略:Firebase Authentication 支援自訂密碼策略,以確保密碼的安全性。
用戶管理:您可以使用 Firebase 控制台或 Firebase Admin SDK 來管理用戶,例如禁用、刪除或鎖定帳戶。
(因為這次只做電子郵件和密碼驗證功能~有空也可以再來試試Google快速登入..等)
那因為本次要使用到 Firebase Authentication的「電子郵件和密碼驗證」,也就是使用者登入某網站時,輸入信箱/密碼註冊該網站的功能,
所以我們再回到Firebase console 控制台開啟電子郵件和密碼驗證
功能
(Firebase console 控制台左側,找到 Authentication服務選項),之後點選「開始使用」
接著您可以看到Firebase 驗證有很多,點選「電子郵件和密碼」
開啟 >「儲存」
這樣設定就完成拉~
備註:可以看看這幾個tab,其中預設的授權網域如下(有需要的可以再自行增加)
這邊指的是在哪些網域下才可以使用 Firebase Auth 功能,若你實作功能有報錯,可以看一下有沒有開通
參考官方文件:
認識 Firebase Authentication
https://firebase.google.com/docs/auth?hl=en
開始在網站上(web)使用 Firebase 身份驗證
https://firebase.google.com/docs/auth/web/start?hl=zh-tw
email 欄位/ password欄位 / 註冊按鈕
詳細程式碼
註冊按鈕 >送createUserWithEmailAndPassword API
import { getAuth, createUserWithEmailAndPassword } from "firebase/auth";
const auth = getAuth();
createUserWithEmailAndPassword(auth, email, password)
.then((userCredential) => {
// Signed up
const user = userCredential.user;
// 註冊成功 跳轉至其他頁面
})
.catch((error) => {
// 錯誤訊息
});
email 欄位/ password欄位 / 登入按鈕
詳細程式碼
登入按鈕 >送signInWithEmailAndPassword API
import { getAuth, signInWithEmailAndPassword } from "firebase/auth";
const auth = getAuth();
signInWithEmailAndPassword(auth, email, password)
.then((userCredential) => {
// Signed in
const user = userCredential.user;
// 登入成功 跳轉至其他頁面
})
.catch((error) => {
// 錯誤訊息
});
備註:註冊登入成功的,可到自己的後台 users看到
AuthErrorCodes
官方文件 AuthErrorCodes
官方有提供註冊或登入catch失敗的error訊息,但是我在新版本碰到一些問題,不管是我登入帳號輸入錯誤 或 密碼輸入錯誤,都會出現Firebase: Error (auth/invalid-login-credentials)
,且也不是有error.code,上網查了一下有人在討論相關問題,詳細可看https://github.com/firebase/firebase-js-sdk/issues/7661
所以網路上一些前輩的寫法會是
...
.catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
// 錯誤訊息
});
這應該舊版的寫法,所以目前等官方更新中?,我目前在範例中一律先不特別處理錯誤訊息,改寫為
const errMsg = ref('');
...
.catch((error) => {
// 錯誤訊息
errMsg.value = '註冊失敗';
});
詳細程式碼
★☆ 使用Firebase 在使用者註冊成功的當下,就會將該使用者自動登入★☆
<button type="button" @click="goToSignIn" v-if="!isLoggedIn">登入</button>
<button type="button" @click="handleSignOut" v-if="isLoggedIn">登出</button>
<button type="button" @click="goToSignUp">註冊</button>
import { getAuth, onAuthStateChanged, signOut } from 'firebase/auth';
const auth = getAuth();
const goToSignUP = () => { // 跳至註冊頁
router.push('/signUp');
};
const goToSignIn = () => { // 跳至登入頁
router.push('/signIn');
};
const isLoggedIn = ref(false); // 判斷是否登入
const handleSignOut = () => {
signOut(auth) // 登出方法,須上方引入
.then(() => {
// Sign-out successful.
isLoggedIn.value = false;
router.push('/'); // 登出成功,跳回首頁
})
.catch(error => {
console.log('登出失敗', error);
});
};
onMounted(() => {
onAuthStateChanged(auth, user => { // 使用方法需上方引入
user ? (isLoggedIn.value = true) : (isLoggedIn.value = false);
});
});
路由設定可參考官方文件
詳細程式碼
{
path: '/successSign',
name: 'SuccessSign',
component: () => import('../views/SuccessSign.vue'),
meta: { requiresAuth: true }
}
無登入 且 無找到登入user
就跳到[登入頁]import { getAuth, onAuthStateChanged } from 'firebase/auth';
const getCurrentUser = () => {
return new Promise((resolve, reject) => {
const removeListener = onAuthStateChanged(
getAuth(),
user => {
removeListener();
resolve(user);
},
reject
);
});
};
router.beforeEach(async (to, from) => {
if (to.meta.requiresAuth && !(await getCurrentUser())) {
return {
path: '/signIn',
query: { redirect: to.fullPath }
};
}
});
這樣就完成了基本功能拉~~~~~
在使用 Firebase Authentication (Firebase 身份驗證) 只是實作登入和登出(未寫入資料庫),也尚未實作更新使用者個人資料、發送信箱認證....等
本次功能上也很多需要優化的地方,包括錯誤訊息/重複的程式碼...等,僅供簡單參考
那我們下次見拉~