後段實作:用 Firebase Console 建立 Firestore
跟著講師在 Firebase Console 建立專案、Web App 與 Firestore,發布教材唯一指定的規則,把六個 Web config 欄位交給 Claude App 填入,最後用 /course-check 與一筆合成資料完成驗收。全程不使用 Firebase CLI。
學完這一課,你會做到
- 用課程固定選項建立 Firebase 專案、Web App 與位於台灣的 Firestore 資料庫
- 完整替換並發布只允許 courseScheduleEntries 資料形狀的課程規則
- 把六個 Firebase Web config 欄位填入正確檔案,不接觸 service account 或私鑰
- 用 /course-check、重新整理與 Firebase Data 頁完成雲端讀寫驗收
開始前先定位
本機功能與客製規則驗收後,先部署 Vercel 取得可分享網址;看見 localStorage 無法跨裝置後,再加入 Firestore 並完成同步。
1. 本機 /course-check 顯示 Firestore cloud mode 與 synced;2. courseScheduleEntries 有一筆合成文件;3. 排班頁重新整理後資料仍存在;4. R…
這份規則為了讓沒有登入功能的課堂教材可以同步,允許任何知道專案的人讀取與刪除 courseScheduleEntries。它只限制集合、欄位與資料形狀,不能辨認使用者。全程只能使用虛構姓名與合成排班;不可放病人、員…
實作 repo 的資料模式
| 課程階段 | 實際資料層 | 能力與限制 |
|---|---|---|
| 階段 1~4 | 瀏覽器 localStorage | 不用安裝資料庫;同一瀏覽器重新整理後仍在,但不能跨裝置同步 |
| 上一課的 Vercel 網站 | 仍是瀏覽器 localStorage | 網站已上線,但每個瀏覽器仍各自保存資料 |
| 本課完成後 | Firebase Firestore | 本機 Preview 已可讀寫雲端合成資料;下一階段再更新既有 Vercel 網站 |
| SQLite | 本 repo 未使用 | 不需要安裝,也不要要求 Claude 額外加入套件或本機資料庫服務 |
講師與全班統一使用的設定
| 項目 | 本課選擇 | 原因/注意 |
|---|---|---|
| Firebase 專案名稱 | wca-schedule-你的GitHub帳號 | 只放合成資料;不要用診所、病人或內部系統名稱 |
| Web App 暱稱 | wca-schedule-web | 這只是 Firebase Console 內的辨識名稱 |
| Firestore edition/模式 | Standard edition/Native mode | 若新版畫面詢問 edition 或 mode,就用這組 |
| Database ID | (default) | 教材程式預設連接這個資料庫 |
| Location | asia-east1 (Taiwan) | 建立後不能更換,按 Create 前再核對一次 |
| 起始規則模式 | Production mode | 建立後立刻貼上本課完整規則;不選 Test mode |
| 資料集合 | courseScheduleEntries | 不必手動建立;第一次由教材成功寫入時自動出現 |
A. 建立自己的 Firebase 課程專案
- 開啟 https://console.firebase.google.com/,以自己的課程 Google 帳號登入,按「建立專案/Create a project」。
- 專案名稱輸入 wca-schedule-你的GitHub帳號。不要放診所名稱、真實人名、病歷號或其他敏感資訊。
- 看到 Project ID 時先核對。這個識別碼建立後不能更改;本課不需要刻意手動改成複雜名稱。
- Google Analytics 對本課不是必要功能;若畫面詢問,可以關閉後繼續。Gemini 或其他加值功能也先略過。
- 按「建立專案」,等畫面顯示完成,再進入專案總覽。
B. 註冊 Web App,先保留設定畫面
- 在 Project overview 按 Web 圖示「</>」;若找不到,進入齒輪 Project settings → General → Your apps,再選 Web。
- App nickname 輸入 wca-schedule-web。這個名稱只用來辨識,不是公開網站網址。
- 不要勾選 Firebase Hosting;上一課已使用 Vercel 建立網站,本課只加入 Firestore。
- 按 Register app。畫面出現 firebaseConfig 物件後先不要關閉;稍後只需要其中六個欄位。

建立 Firestore 的官方網頁流程:在 Firebase Console 選 Firestore、Create database、區域與起始規則模式。本課在按 Create 前固定核對 asia-east1 (Taiwan)。
- 左上角先確認目前是自己的 wca-schedule 課程專案。
- Database ID 使用 (default),Location 使用 asia-east1 (Taiwan)。
- 起始選 Production mode;下一步立即替換成教材指定規則。
C. 建立 (default) Firestore 資料庫
- 從左側選單進入 Databases & Storage → Firestore Database,按 Create database。
- 若畫面詢問 edition 或 mode,選 Standard edition/Native mode;Database ID 保持 (default)。
- Location 選 asia-east1 (Taiwan)。資料庫位置建立後不能更換,按下一步前請再讀一次畫面。
- 起始規則選 Production mode,不選 Test mode;接著按 Create 建立資料庫。
- 資料頁暫時是空的完全正常。現在不要按 Start collection;courseScheduleEntries 會在教材第一次成功寫入時自動建立。
為什麼不選 Test mode?
| 選項 | 本課做法 | 風險 |
|---|---|---|
| Production mode | 選它,再立即發布下方教材規則 | 起始會拒絕 App 存取,直到規則發布完成 |
| Test mode | 不選 | 暫時全面開放且會到期,容易讓新手誤以為資料庫已安全設定 |
| 全域 allow true | 禁止 | 任何人都可能讀寫整個資料庫;不能拿來解決 permissions 錯誤 |

本課只使用畫面上半部的 Firebase Console 路線:Firestore → 規則 → 線上編輯器 → 發布。畫面下方 CLI 是官方的另一種方式,不屬於主課程。
- 確認目前是自己的課程 Firebase 專案與正確資料庫。
- 只貼入課程當期已審核的 demo 規則,不自行改成全面開放。
- 發布後用合成資料驗收;Missing permissions 要查原因,不可拆掉門鎖。
D. 用教材完整規則取代起始規則
- 在 Firestore Database 頁切到 Rules/規則分頁,先核對左上角仍是自己的專案與 (default) 資料庫。
- 在編輯器內全選並刪除原本的起始規則。不要只把新規則貼在舊規則下方。
- 按下方複製按鈕,將整份規則原樣貼入。確認集合名稱是 courseScheduleEntries,最後一段是 allow read, write: if false。
- 按 Publish/發布。發布後先等候約一分鐘,再進行教材驗收;不要因短暫 permissions 錯誤改成全面開放。
直接複製:本課唯一允許的 Firestore Rules
必須整份取代 Firebase Console 裡的起始內容並發布。不要省略註解以外的任何一行,也不要把 false 改成 true。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// 課程 Demo 沒有登入,因此這不是正式的使用者存取控制。
// 規則只限制可寫入的集合、欄位與資料形狀;專案只准放合成資料。
match /courseScheduleEntries/{entryId} {
allow read: if true;
allow create, update: if validEntry(entryId);
allow delete: if true;
}
match /{document=**} {
allow read, write: if false;
}
function validEntry(entryId) {
let data = request.resource.data;
return data.keys().hasOnly([
'id', 'date', 'personId', 'state', 'shiftId', 'note', 'updatedAt'
])
&& data.keys().hasAll(['id', 'date', 'personId', 'state', 'updatedAt'])
&& data.id == entryId
&& data.id is string
&& data.date is string
&& data.date.matches('^\\d{4}-\\d{2}-\\d{2}$')
&& data.personId is string
&& data.personId.size() > 0
&& data.personId.size() <= 80
&& data.state in ['shift', 'leave']
&& data.updatedAt is int
&& (!data.keys().hasAny(['note']) || (data.note is string && data.note.size() <= 200))
&& (
(data.state == 'shift'
&& data.keys().hasAll(['shiftId'])
&& data.shiftId in ['morning', 'afternoon', 'evening'])
||
(data.state == 'leave' && !data.keys().hasAny(['shiftId']))
);
}
}
}這份規則實際允許與阻擋什麼
| 規則 | 結果 | 教學意義 |
|---|---|---|
| courseScheduleEntries 可讀取、可刪除 | 未登入也能讀取與刪除 demo 資料 | 只適合全為合成資料的課程環境 |
| 建立/更新前呼叫 validEntry | 只接受指定欄位、日期格式、班別、狀態與長度 | 避免任意資料形狀被寫進教材集合 |
| 其他所有路徑都是 false | 不能建立第二個未核准集合 | 若集合拼錯,不是把門打開,而是修正名稱 |
| 沒有登入與角色判斷 | 無法辨識院長、醫師或助理 | 這不是正式診所權限系統 |
E. 找到 Web config 的六個欄位
- 按 Firebase Console 左上角齒輪 → Project settings → General。
- 往下找到 Your apps,選剛才建立的 wca-schedule-web。
- 在 SDK setup and configuration 選 Config,不選 npm 或 CDN 教學指令。
- 準備把 apiKey、authDomain、projectId、storageBucket、messagingSenderId、appId 六個值提供給 Claude。不要提供 service account、私鑰、密碼、token 或驗證碼。
六個欄位要一一對應
| Firebase 欄位 | 教材檔案中的欄位 | 常見錯誤 |
|---|---|---|
| apiKey | apiKey | 誤以為是 service account 私鑰 |
| authDomain | authDomain | 漏掉完整網域 |
| projectId | projectId | 拿到另一個 Firebase 專案 |
| storageBucket | storageBucket | 自行猜測或改寫後綴 |
| messagingSenderId | messagingSenderId | 和 appId 對調 |
| appId | appId | 漏貼前後字元 |
請 Claude App 只填 Firebase Web config
請只修改 `src/course/firebase.config.ts`,把我接下來提供的 Firebase Web config 六個欄位填入對應位置:apiKey、authDomain、projectId、storageBucket、messagingSenderId、appId。請保留欄位名稱與其他檔案不變,不要安裝套件、不要修改 firestore.rules、不要 commit、不要 push。這些值只能來自我自己的 Firebase Web App;不要要求 service account JSON、私鑰、密碼、token 或驗證碼。完成後請列出實際修改的檔案與六個欄位名稱,不要重貼完整值。F. 用 /course-check 與 Firebase Data 頁完成驗收
- Claude 修改完成後先看 Review changes:只能有 src/course/firebase.config.ts,而且六個 PASTE_YOUR_ 佔位文字都已被取代。
- 在 Claude App 重新啟動 Preview,打開 Preview 網址後在網址最後加上 /course-check。不要另外開 Terminal。
- 確認 Firebase Web config 檢查通過,資料模式顯示 Firestore cloud mode,連線狀態顯示 synced。若仍是 localStorage,先看下方排錯表。
- 回到排班頁,用「王醫師(虛構)」等合成資料建立一筆班別,重新整理頁面,確認資料仍存在。
- 回 Firebase Console → Firestore Database → Data,應看到自動建立的 courseScheduleEntries 集合與一筆文件。不要手動建立其他集合。
- 截圖驗收前,確認畫面沒有真實姓名、診所資料、帳號 email、token 或其他敏感內容。
卡住時依錯誤訊息處理
| 看到的狀況 | 優先檢查 | 禁止的捷徑 |
|---|---|---|
| 仍顯示 localStorage | 六個欄位是否仍有 PASTE_YOUR_、Preview 是否已完整重新啟動 | 不要重做 Firebase 專案 |
| Missing or insufficient permissions | 是否選到正確 projectId/(default) 資料庫、完整規則是否已 Publish;等候約一分鐘再試 | 不要改成 allow read, write: if true |
| Data 頁沒有集合 | 先從排班 App 建立一筆合成資料;集合會在首次成功寫入時出現 | 不要手動造一個拼錯的集合 |
| 只有一位同學的資料不同步 | 比對 /course-check 的 mode、status 與 projectId,再核對 config 是否貼錯專案 | 不要互傳帳號、密碼或 service account |
| 本機已是 Firestore、Vercel 仍顯示本機練習 | 這是本課預期狀態;階段 5 才核准 commit、push,讓既有 Vercel 專案更新 | 不要重新建立第二個 Vercel 專案 |
Checkpoint:四項證據都通過才算完成
1. 本機 /course-check 顯示 Firestore cloud mode 與 synced;2. courseScheduleEntries 有一筆合成文件;3. 排班頁重新整理後資料仍存在;4. Rules 頁是本課完整規則,沒有 Test mode 或全域 allow true。完成後先停下,下一階段才把這次變更更新到既有 Vercel 網站並做三裝置驗收。
參考資料
介面與方案會改版;實際操作仍以各工具官方頁面為準。延伸資料用來幫助理解,不取代本課安全原則。