上一篇我們完成了 Firebase 提供的 MFA(SMS 驗證碼)綁定流程,這篇我們把它升級成「真正實用」的版本:
登入方式 | Firebase API |
---|---|
Email + Password | signInWithEmailAndPassword |
Email Link(免密碼) | sendSignInLinkToEmail / signInWithEmailLink |
Google Login | signInWithPopup(GoogleAuthProvider) |
這三種登入方式都會得到一個 user,但有趣的是:
Google Login 太輕鬆,有些情境下還是會希望要求他補強安全性,所以統一進 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 不會讓你直接進系統,而是丟出一個 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);
}
}