iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
Modern Web

不只是登入畫面!一起打造現代化登入系統系列 第 27

進階版 MFA 實作:Email / Google 登入 + SMS 二階段驗證

  • 分享至 

  • xImage
  •  

上一篇我們完成了 Firebase 提供的 MFA(SMS 驗證碼)綁定流程,這篇我們把它升級成「真正實用」的版本:

  • 支援 三種登入方式:Email + Password、Email Link(免密碼)、Google Login
  • 登入後 統一要求綁定手機(第二層)
  • 之後登入時,若該帳號已有 MFA,自動跳出驗證流程

登入方式三選一(這邊可以依專案挑)

登入方式 Firebase API
Email + Password signInWithEmailAndPassword
Email Link(免密碼) sendSignInLinkToEmail / signInWithEmailLink
Google Login signInWithPopup(GoogleAuthProvider)

這三種登入方式都會得到一個 user,但有趣的是:
Google Login 太輕鬆,有些情境下還是會希望要求他補強安全性,所以統一進 MFA 流程是最穩定的做法。


登入後檢查是否已綁定 MFA

const auth = getAuth();
auth.onAuthStateChanged((user) => {
  if (!user) return;

  const factors = multiFactor(user).enrolledFactors;
  if (factors.length === 0) {
    // 尚未綁定 → 跳出 MFA 設定畫面
    openMFASetupModal();
  } else {
    // 已綁定 → 直接進系統
    navigate("/dashboard");
  }
});

登入時若有設定 MFA,Firebase 會自動要求再驗證一次

當使用者下次登入時,如果該帳號有啟用 MFA,Firebase 不會讓你直接進系統,而是丟出一個 auth/multi-factor-auth-required 的錯誤。

try {
  await signInWithEmailAndPassword(auth, email, password);
} catch (error) {
  if (error.code === "auth/multi-factor-auth-required") {
    const resolver = getMultiFactorResolver(auth, error);

    // 可以取出該使用者有哪些驗證方式,例如 SMS
    const hint = resolver.hints[0]; // 例如 phone number

    // 接著你就可以讓他輸入驗證碼
    const cred = PhoneAuthProvider.credential(hint.session, smsCode);
    const result = await resolver.resolveSignIn(cred);
  }
}

上一篇
多重身份驗證(MFA)
系列文
不只是登入畫面!一起打造現代化登入系統27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言