第19章:強い認証の入口:MFA(多要素)の位置づけだけ触れる🧿
この章は「実装をガッツリ」じゃなくて、“必要になる場面”を言語化して、設計に落とすのがゴールだよ🙂 (ただし、雰囲気が掴める最小のハンズオンはやるよ〜🛠️)
0) この章のゴール🎯
- MFA(多要素認証)って何を守れるの?を説明できる🙂
- 「うちのアプリは いつMFAが必要?」が決められる🧠
- “重要操作だけMFA”みたいな 段階的(Step-up) の発想が入る🚧
- Firebase側で MFAを有効化する場所を知っておく🔧
- できれば「MFA必須になる瞬間」のエラー(
multi-factor-auth-required)を一回見ておく👀
1) そもそもMFAってなに?🧩

**MFA(Multi-Factor Authentication)**は、ログイン時に 「パスワードだけ」じゃなくて 追加の確認(2段階) を入れる仕組みだよ🔐✨
よくある現実😇👇
- パスワードは漏れる(使い回し・フィッシング・流出…)💥
- Googleログインでも“セッション乗っ取り”みたいな事故はゼロじゃない😵
- そこで「本人が持ってるもの(スマホ)」や「アプリのコード」で追加チェック🧿
2) FirebaseでのMFAの現実(Web編)🧠
✅ SMSのMFA(Web)は「Identity Platform へのアップグレード」が前提
Firebase公式のWeb向けMFAは、Firebase Authentication with Identity Platform にアップグレードして使う流れが明記されてるよ。(Firebase) コンソールの Authentication → Sign-in method → Advanced あたりで SMS Multi-factor Authentication を有効化する感じ👍(Firebase)
開発中は テスト用電話番号を登録しておくのが強く推奨(スロットリング回避)って書かれてるよ📵💦(Firebase)
✅ TOTP(認証アプリの6桁コード)も“Webに追加”できる
Web向けに TOTP MFA を追加する公式ページがあるよ(QRを読み取って認証アプリでコード生成するやつ)📱🔢(Firebase) プロジェクト側でTOTPを有効にするには Admin SDK か project config のRESTで設定する流れになってる。(Firebase) さらに、Admin Node SDK v11.6.0+ が必要って条件も明記されてるよ🧷(Firebase)
3) MFAは「全員必須」にする?「必要な人だけ」にする?🤔

Firebase公式でも、MFAの“入れ方パターン”が整理されてるよ👇(Firebase)
パターンA:全員必須(強いけど重い)💪🧱
- 管理画面・金融・医療など、最初からガチガチに守る必要がある場合向け🏦🩺
- UXは重くなりやすい(離脱も増えやすい)😵💫
パターンB:登録時に「スキップ可」で勧誘(バランス型)🌈
- まずは使ってもらい、後からMFAを付けてもらう🙌
- “後回しにされる”リスクはある🥲
パターンC:重要操作だけMFA(Step-up認証)🚧✨ ← 初学者におすすめ

- 普段ログインは軽く
- 「お金」「権限」「個人情報」「破壊操作」 の直前だけMFA要求🔥
- UXと安全のバランスが良い🙂
4) まず決めること(設計ワーク)📝🧠
ここが一番大事!✨ あなたのアプリで「MFAを要求すべき操作」をリスト化しよう👇
“MFAが欲しい操作”テンプレ✅

- 🔐 パスワード変更
- 📧 メールアドレス変更
- 💳 決済 / 返金 / プラン変更
- 👑 権限変更(admin付与・削除)
- 🗑️ データ削除(復元できない)
- 📦 個人データのエクスポート(CSVダウンロード等)
- 🔑 APIキー発行 / 再生成
- 🧾 請求情報の閲覧(住所・カード末尾など)
ルール例(そのまま使ってOK)🙂
- ログイン直後:MFAなしでOK
- 上の重要操作を押した瞬間:Step-up(MFA要求)
- 直近5分以内にStep-up済みなら:もう一回は要求しない(UX配慮)⏱️
5) “UI導線”の作り方(実装前に絵を描く)🎨🧭

最低限これだけ決めると、後の実装が超ラクになるよ🙂
-
「セキュリティ設定」ページを作る🔐
- MFA未設定 → “おすすめです” + 設定ボタン
- MFA設定済み → “解除” は慎重に(Step-up必須に)
-
重要操作を押したら
- 「この操作は大事なので追加確認します🧿」モーダル
- MFAフローへ誘導
6) 手を動かす(最小)🛠️✨
6-1) コンソール側:MFAをONにする🔧
- Authentication → Sign-in method → Advanced → SMS Multi-factor Authentication を有効化
- テスト用電話番号も入れておく(開発が安定する)📞🧪(Firebase)
6-2) ローカルでMFAを“安全に試す”ならエミュレータが強い🧯
FirebaseのCodelabでは、Auth EmulatorがMFAをサポートしていて、ログインすると MFAコードがターミナルに出るって説明されてるよ(開発を自己完結にできる)🧪🖥️(Firebase)
7) 手を動かす(最小コード)🧩 TypeScriptで“MFA必須エラー”を受け止める

この章では「MFAの本実装」までは踏み込まず、 “MFAが必要になったら専用UIに切り替える”入口だけ作るよ🚪✨
例:重要操作(例:メール変更)の前に「追加確認が必要かも」を受ける
import { getMultiFactorResolver } from "firebase/auth";
import type { Auth } from "firebase/auth";
export async function runSensitiveAction(auth: Auth) {
try {
// ここに「重要操作の前の再認証」や「重要操作そのもの」を置くイメージ
// 例: reauthenticateWithCredential(...) とか、メール変更処理とか
} catch (e: any) {
// MFAが必要なときに来る代表エラー
if (e?.code === "auth/multi-factor-auth-required") {
const resolver = getMultiFactorResolver(auth, e);
// resolver.hints に「どの2段階を使えるか」が入る(SMS/TOTPなど)
// → ここで “MFA入力モーダル” を開く、という設計にする
return {
needMfa: true,
resolver,
};
}
// その他は普通に投げる
throw e;
}
}
ポイント🙂👇
- **「MFAは別画面/別モーダル」**に逃がすと実装が綺麗になる✨
- この章では
resolverを受け取って「UIを開く」だけでOK🙆♂️ - 次の段階で、SMS/TOTPそれぞれのフローを埋めていく感じ!
8) ミニ課題🎯:「セキュリティ設定ページ」を作る🔐🧿
作るもの👇
-
/settings/security的なページ🧭 -
表示だけでOK(本実装は後回しでもOK)🙆♂️
- ✅ 「MFA:未設定 / 設定済み」を表示
- 🔘 「MFAを設定する」ボタン(今は“準備中”でもOK)
- 🚨 「MFAを解除する」ボタン(押したら“重要操作なので追加確認します”と出す)
🔥AIを絡める(Firebase AI Logic / Gemini)

「なんでMFAが必要なの?」をユーザーに優しく説明する文章、毎回手で書くのしんどいよね🥲 そこで、説明文だけGeminiに生成させるのが気持ちいい✨
- 例:「決済・個人情報の変更は追加確認が必要な理由」を、短く/丁寧に/怖がらせずに…みたいに生成💬🤖 (AI Logic自体の呼び出し詳細はAI章で本格的にやる想定で、この章では“使いどころの発想”を掴めればOK🙂)
9) チェック問題✅(3分でOK)
- MFAを入れる目的を一言で言うと?🔐
- あなたのアプリで「重要操作」3つ挙げると?📝
- “全員必須” と “重要操作だけ” の違い(メリット/デメリット)を言える?⚖️
auth/multi-factor-auth-requiredが出たら、UIはどう切り替える?🧭
10) つまずきがちな所😵💫(先回りメモ)
- SMSが届かない / 遅い📵 → 開発中は テスト用電話番号登録が推奨(スロットリング回避)(Firebase)
- ローカル検証が面倒🌀 → Auth Emulator + MFA の流れがCodelabで案内されてる(コードがターミナルに出る)(Firebase)
- TOTPをやりたいけど、どこでON?🤔 → Web向けTOTP追加ページ&プロジェクト側の有効化手順が公式にある(Firebase)
11) Antigravity / Gemini CLI に投げると爆速になる依頼例🚀🤖
-
Antigravity(エージェント型IDE)で「設計の叩き台」を作らせる🧠🧱(Google Codelabs)
- 「このアプリ(認証あり)の重要操作を想定して、MFAを要求すべき一覧を作って」
- 「Step-up認証の画面遷移図をMermaidで出して」🗺️
-
Gemini CLI(ターミナルのAIエージェント)で「プロジェクト点検」🔎(Google for Developers)
- 「重要操作っぽい関数を列挙して、MFAを噛ませるべき箇所を指摘して」
- 「エラー表示の文言を、ユーザーが次に何をすれば良いか分かる日本語に整えて」🙂
この章のまとめ🎉
- MFAは「ログインの強化」だけじゃなく、**重要操作の前にだけ要求する(Step-up)**のが強力🚧✨
- WebのSMS MFAは Identity Platform前提で、コンソールで有効化&テスト番号が推奨📞(Firebase)
- TOTPもWebで扱える流れが公式にある(プロジェクト側で有効化が必要)🔢(Firebase)
- 実装は次段階でOK。今は “いつ必要か”を決めて、UI導線を作るだけで勝ち🙂🏆
次の章(第20章)はミニ課題の総仕上げだね✅🚪 もし「Step-upで、具体的にどの操作からMFAを噛ませるのが気持ちいいか」も一緒に決めたいなら、あなたのアプリの想定(例:管理画面/投稿/課金あり等)に合わせて“重要操作リスト”をカスタムして提案するよ🙂✨