Skip to main content

第3章:FCMの全体像(送る側・受ける側・IDの話)🧩📮

この章のゴール🎯

  • 送る側(サーバー)と受ける側(ブラウザ/アプリ)の役割分担を、1枚で説明できるようになる🗣️✨
  • ID/鍵/トークンの「公開OK」と「絶対NG」を見分けられるようになる🔐✅
  • 「コメント通知」を例に、どこから誰に何を送るかの道筋が描けるようになる🧠➡️📣

1) 登場人物(FCMの“班分け”)👥🧩

Four Roles of FCM Architecture

FCMはざっくり 4人 で回ってます👇

  1. クライアント(Reactアプリ) ⚛️

    • 通知を受け取る(フォアグラウンドの処理など)
    • 端末トークン(registration token) を取得する📱💻
  2. Service Worker 🧑‍🚒

    • ブラウザが裏にいる時(バックグラウンド)に受け取って、通知表示の主役になる
    • Web Pushの要!🧩 (Firebase)
  3. FCM(Firebase側) 📮

    • “宛先”に向けて配達してくれる郵便局みたいな存在
  4. 送信サーバー(信頼できる場所) 🏗️📤

    • Admin SDK か HTTP v1 API で送る(いまは v1が前提)(Firebase)
    • 秘密(サービスアカウント等)を持つのはココだけ 🔥

2) ざっくり全体フロー(3レーン図)🛣️🛣️🛣️

FCM Message Flow

「受け取り準備」→「イベント発生」→「送信」→「受信」の一本道にするとこう👇

[ユーザー操作] 

(React) 通知をONにする → 許可 → token取得
↓ tokenを保存(Firestoreなど)🗃️
────────────────────────────────────
コメントが付いた!📝(Firestoreに新規ドキュメント)

(送信サーバー) Firestoreトリガー等で検知⚡

Admin SDK / HTTP v1 で FCMへ送信📤

(FCM) 宛先へ配達📮

(ブラウザ)
├─ フォアグラウンド:React側で受けてUI更新✨
└─ バックグラウンド:Service Workerが受けて通知表示🔔

WebのFCMでは VAPIDキー(Web Push用の資格証)が絡みます。「プロジェクトに鍵ペアを紐付ける」やつです🔑 クライアントは 公開鍵(public key) を使う側、というイメージでOKです👌 (Firebase)


3) “宛先”の種類:トークン / トピック / 条件 🎯📬

FCM Target Types

FCMのターゲット指定は基本これ👇

A. 端末トークン(registration token)📱🎫

  • 「この端末のこのアプリ」宛の住所ラベル
  • 1人がPC/スマホ両方使うなら、ユーザー1人に複数トークンが自然📱💻✨
  • トークンは変わることがあるので、更新・掃除が後で効いてきます🧹🧯(第8章・第17章でガッツリ)

B. トピック(topic)📣🗞️

  • **「メーリングリスト」**みたいに、同じ興味の人へ一斉送信
  • 送信は Admin SDK / HTTP v1 の両方でOK (Firebase)
  • Webのトピック購読には、運用面の注意(スロットル/制限)もあるので「多用しすぎない」設計が安全🧯(status.firebase.google.com)

C. 条件(condition)🧠🔀

  • 「AにもBにも興味ある人」みたいな 論理式で配るやつ
  • 例:'news' in topics && ('sports' in topics || 'music' in topics) みたいな感じ(雰囲気だけ覚えればOK)

4) IDの話(ここが混乱ポイント!)🧩🧾

Public vs Secret Keys

「どれが公開で、どれが秘密か」を整理すると勝ちです🏆✨

✅ 公開してOK(クライアントに入って当たり前)🌞

  • FirebaseのWeb設定(firebaseConfig)apiKeyprojectId など

    • 名前が “apiKey” でも 秘密鍵ではない(誤解しやすい😇)
  • VAPID公開鍵(Web Push用):クライアントが getToken() 等で使う側 (Firebase)

❌ 絶対に出しちゃダメ(サーバー専用)🔥🔒

  • サービスアカウントJSON(秘密のかたまり)
  • Admin SDKの秘密(実質、強い権限を持つ)
  • HTTP v1 API を叩くための OAuthアクセストークン(サーバー側で作る)(Firebase)

ここが第3章の最重要チェックです👇 👉 「通知を送りたい気持ち」が先走って、クライアントに秘密を置かない 😇🧯


5) メッセージの“送り方”2択(サーバー側)📤⚙️

Admin SDK vs HTTP v1 API

① Admin SDK(いちばん楽で安全寄り)🛡️

  • トークン宛・複数トークン宛(マルチキャスト)・トピック宛などが揃ってる
  • 例:最大500トークンへ同報、最大500メッセージのまとめ送信などができる (Firebase)

② FCM HTTP v1 API(仕組みを理解すると強い)🧠💪

  • エンドポイントは .../v1/projects/{projectId}/messages:send の形
  • 認証は Bearer(OAuth) で送る (Firebase)

6) Web通知の“空気”も最新事情あり🌬️🔔

ブラウザ側は「許可の取り方」をミスるとブロック率が跳ねます🙅‍♂️➡️🙆‍♀️ ユーザー操作(クリック等)に紐づけて許可を出すのが王道です🧠 (MDN Web Docs)

さらに最近の動きとして、ChromeがPush APIのレート制限を段階展開し始めています。 「通知を乱発するサイト」を抑える方向なので、“うざくならない設計”はガチで重要になってきます😇⛔ (Chrome for Developers)


7) AIを絡めると、FCM設計が一段ラクになる🤖📝✨

ここからが“2026っぽい”ところ💡

A. Firebase AI Logicで「短くて伝わる通知文」を作る📝➡️✨

  • アプリからGemini/Imagenを呼ぶ導線として整理されていて、通知文生成と相性いいです🤖
  • 例えば「コメント本文→通知用に短縮」「個人情報っぽい文字をマスク」みたいな下ごしらえができます🧤🫧 (Firebase)

B. Antigravity / Gemini CLIで「図・設計・チェック」を一気に作る🛸💻

  • Antigravityは“エージェントが計画→実装→検証”まで回す思想の開発基盤として紹介されています🧠🛠️ (Google Codelabs)
  • Gemini CLIはターミナルから調査・修正・テスト生成などを支援する流れが公式に整理されています💻✨ (Google Cloud Documentation)

**おすすめの使い方(プロンプト例)**👇 AI Reviewing Architecture

(そのまま貼ってOKの「指示文」になってます)

あなたはFirebase/FCMの設計レビュー役です。
「Web(React) + FCM + Firestore + 送信サーバー」でコメント通知を作ります。

1) 送る側/受ける側/保存先/秘密情報 の役割分担を箇条書き
2) “クライアントに置いちゃダメ”な情報を列挙して危険度も付ける
3) 1枚図(Mermaid)で全体像を出す
4) トークン複数端末、無効トークン掃除、通知頻度抑制 の観点で改善案を3つ

手を動かす🖱️(10分)🧩✍️

ステップ1:あなたのアプリの“登場人物”を埋める👥

下のテンプレを、自分の言葉で埋めてください(図じゃなく文字でもOK)👇

  • 受ける側(React)がやること:
  • Service Workerがやること:
  • FCMがやってくれること:
  • 送る側(サーバー)がやること:
  • Firestoreに保存するもの(例:token):

ステップ2:“公開OK/秘密NG”を線引きする🔐✂️

次の2列を作って、単語を振り分けるだけでOK👇

  • 公開してOK:firebaseConfig / VAPID公開鍵 / projectId ...
  • 絶対NG:サービスアカウントJSON / OAuthトークン / Admin権限 ... (Firebase)

ミニ課題🎯(5分)📝➡️🔔

「コメント → 誰に → 何を → どこから送る」 を1枚にします📄✨ テンプレはこれ👇(矢印だけでOK!)

イベント:コメントが作成された
↓ どこで検知?
送信サーバー:__________
↓ 何を参照?
宛先:__________(token / topic / condition)
↓ payloadには何を入れる?
通知タイトル:__________
通知本文:__________
遷移URL/ID:__________
↓ どこに届く?
受信:フォア(React) / バック(SW) どっち?______

チェック✅(理解確認)🧠✨

  1. クライアントに秘密(サービスアカウント等)を置いてない? 🔥
  2. トークン=ユーザー1人に1個って決め打ちしてない?(複数端末あるよね📱💻)
  3. Webの通知で Service WorkerVAPID の位置づけ、説明できる?🧑‍🚒🔑 (Firebase)
  4. 最近のChrome事情(通知乱発へのレート制限)を踏まえて、“送る価値”を設計に入れられてる? 😇⛔ (Chrome for Developers)

必要なら、この第3章の「1枚図(Mermaid)」をあなたの教材用に“完成版”としてこちらで作って貼れますよ🗺️✨(次の章でその図を実装へ落とすと、めちゃ気持ちよく進みます⚡)