iT邦幫忙

2026 iThome 鐵人賽

DAY 15
0
Vibe Coding

神隊友.swift:30 天 Vibe Coding 打造育兒 iOS App 系列 第 15 篇

[Day 15] Security Rules 擋得住 App,擋不住管理者:建 Firebase 正式專案踩到的三件事

  • 分享至 

  • xImage
  •  

Day 15

文章同步發表在我的個人 Blog

Security Rules 擋得住 App,擋不住管理者:建 Firebase 正式專案踩到的三件事

到目前為止,App 連的都是 Firebase Emulator,也就是在自己電腦上模擬的 Firebase。要裝到手機給家人用,得先建立 Firebase 的正式專案。

昨天列的「還沒做的部分」,第一件就是它。

先講結果:Firebase 正式專案建好、安全規則部署上去,也在專案裡加入 iOS App、下載了 App 連線要用的設定檔;兩台模擬器改連正式專案,爸爸丟一件事,媽媽那台就出現在「待你知道」。

模擬器上的神隊友歡迎頁,正式模式沒有崩潰

換上正式設定檔重新啟動,App 判斷成正式模式,直接連 teammate-family-tw,停在歡迎頁,沒有崩潰。匿名登入要等按下「建立家庭」才會發生,所以這時候還沒登入。

1. Firestore 位置選了就不能改

Firestore 建立資料庫時要選一個地區,之後改不了。官方文件:

Be aware that once you provision a database instance, you cannot change its location setting.

想換地區只能整個資料庫砍掉重建,資料要自己搬。這次選 asia-east1(台灣),機房離兩支手機最近;家庭用的資料量很小,選哪個地區差別不大,但選了就不能改,所以一開始就選離使用者最近的。

2. 動手前先用唯讀指令看現況

建立雲端資源前,Claude Code 先用唯讀指令確認現況:firebase projects:list、apps:list、firestore:databases:list。建 Firestore 前先確認真的還沒建好才執行 create;teammate-family 這個名字也是查了才發現被別的帳號註冊過,改用 teammate-family-tw。

這麼保守,是因為專案 ID 用過就不能再用,刪掉專案也一樣,不是等一段時間就能拿回來。Google Cloud 文件寫得很明確:

It cannot be in use or previously used; this includes deleted projects.

建立專案和下一節的部署規則一樣,指令一執行就在正式環境生效,做錯很難收回,所以先用唯讀指令確認現況再動手。

3. 部署規則的時候,Claude Code 自己先擋了一次

專案、Firestore、匿名登入在 Console 上手動點好之後,建 iOS App、下載設定檔、部署安全規則都能用 CLI 一次做完。前兩個順利執行,部署規則的那一行被擋下來:

Permission for this action was denied by the Claude Code auto mode classifier.
Reason: [Production Deploy].

Claude Code 把「部署到正式環境」歸類成要我自己確認,不會自動執行。建 App、下載設定檔沒被擋,只有真的發佈規則這一步被判定成正式環境的異動。

Firestore 規則畫面,開頭是規則檔的註解說明

部署上去的,就是 Day 14 提過、通過 79 個測試的權限規則。

4. 管理者帳號查資料,Security Rules 不會擋

Firestore 有兩種進來的方式,檢查的東西不一樣:

誰 從哪裡進來 檢查什麼 看得到什麼
App 使用者(匿名登入) App Security Rules 只有自己家庭的資料
專案管理者(我的 Google 帳號) Console、gcloud、REST API IAM(Google Cloud 的帳號權限) 整個資料庫,所有家庭

規則裡寫明(說明在 firebase/SCHEMA.md):households、invites 禁止列出,App 只能用已知的 id 一筆一筆讀,所以使用者沒辦法掃出別人家的資料。

但我用自己的 Google 帳號,透過 gcloud 拿 access token,直接打 Firestore 的 REST API,同樣是「列出 households」,整批都查得到,規則沒有作用。官方文件寫得很清楚:

In this environment, requests are not evaluated against your Firebase security rules. Privileged Firebase servers are secured using Identity and Access Management (IAM).

也就是說,Security Rules 只管從 App 進來的使用者;有專案管理權限的帳號走 IAM,規則根本不會檢查。Console 打得開所有資料,也是同樣的原因。

目前只有我的帳號有這個專案的管理權限,所以沒有安全問題。要記得的是:管理者帳號本身就是整個資料庫的鑰匙,要保護好的是這個帳號,規則擋不住它。

5. 免費方案、匿名登入維持原案

Spark 方案不需要綁信用卡,Firestore 免費額度是每天 5 萬次讀取、2 萬次寫入、2 萬次刪除、1 GiB 儲存空間、每月 10 GiB 流量,兩個人完全用不到這個量。登入維持 Day 14 A-004 的決定:先用匿名,之後升級成 Google 登入,uid 不變、資料不用搬。

6. 兩台模擬器連上正式專案

裝到手機之前,先用兩台模擬器當成兩支手機:iPhone 17e 當爸爸,iPhone Air 當媽媽,都連到 teammate-family-tw。爸爸建立家庭、媽媽用邀請碼加入之後,爸爸從自己那台丟了一件「討論雙十國慶要去哪裡露營」,排在明天。左邊是爸爸這台,右邊是媽媽這台:

左:爸爸這台,標著「對方還沒看到」;右:媽媽這台,出現在「待你知道」

爸爸這邊,這件事排在明天的時間軸上,標著「對方還沒看到」;媽媽那邊,同一件事出現在最上面的「待你知道」,標著「Dad 丟給你」,等她按「知道了」。今晚 22:00 那件她已經按過,所以打了勾。這就是 Day 13 說的核心:對方沒按「知道了」之前,這件事會一直留在她的首頁頂端。

跟之前的測試不一樣的地方是,這次資料存進 Firebase 的正式專案,不是本機的 Firebase Emulator。

7. 目前的狀態

Firebase 專案總覽:teammate-family-tw,Spark 方案,已加入 iOS App「神隊友」

項目 結果
Firebase 專案 teammate-family-tw,Spark 方案
Firestore asia-east1,正式版模式
Authentication 匿名登入已啟用
安全規則 已部署
iOS App 已建立,GoogleService-Info.plist 已下載
雙人同步 兩台模擬器連正式專案,卡片同步成功
裝到手機 明天

Firestore 資料庫結構:households、invites 集合,household 底下有 cards、members 子集合

集合結構跟 firebase/SCHEMA.md 對得上:households 底下每個家庭一份文件,子集合分 cards、members,上一節爸爸丟的兩件事就存在 cards 裡。

還沒做的部分:

  • 裝到兩支 iPhone(開發者模式、跟 Mac 配對、用腳本裝機)

明天

Day 16 裝到真的 iPhone 上實際用,遇到什麼問題就修什麼,不再加新功能。

參考資源

官方文件


上一篇
[Day 14] 讓 AI 自己跑一整天:規則寫成文件、腳本通過才算、兩個 AI 互審
系列文
神隊友.swift:30 天 Vibe Coding 打造育兒 iOS App 共 15 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言