0%
後段實作:先上線,再加入雲端同步19
後段課堂實作60 分鐘最後確認 2026-07-25

後段實作:用 Firebase Console 建立 Firestore

跟著講師在 Firebase Console 建立專案、Web App 與 Firestore,發布教材唯一指定的規則,把六個 Web config 欄位交給 Claude App 填入,最後用 /course-check 與一筆合成資料完成驗收。全程不使用 Firebase CLI。

19

學完這一課,你會做到

  • 用課程固定選項建立 Firebase 專案、Web App 與位於台灣的 Firestore 資料庫
  • 完整替換並發布只允許 courseScheduleEntries 資料形狀的課程規則
  • 把六個 Firebase Web config 欄位填入正確檔案,不接觸 service account 或私鑰
  • 用 /course-check、重新整理與 Firebase Data 頁完成雲端讀寫驗收

開始前先定位

你在這裡後段實作:先上線,再加入雲端同步

本機功能與客製規則驗收後,先部署 Vercel 取得可分享網址;看見 localStorage 無法跨裝置後,再加入 Firestore 並完成同步。

完成證據Checkpoint:四項證據都通過才算完成

1. 本機 /course-check 顯示 Firestore cloud mode 與 synced;2. courseScheduleEntries 有一筆合成文件;3. 排班頁重新整理後資料仍存在;4. R…

本課先不做這是課堂 demo 規則,不是正式診所規則

這份規則為了讓沒有登入功能的課堂教材可以同步,允許任何知道專案的人讀取與刪除 courseScheduleEntries。它只限制集合、欄位與資料形狀,不能辨認使用者。全程只能使用虛構姓名與合成排班;不可放病人、員…

本課名詞FirebaseFirestoreWeb configSecurity RulescourseScheduleEntriescourse-check

實作 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)教材程式預設連接這個資料庫
Locationasia-east1 (Taiwan)建立後不能更換,按 Create 前再核對一次
起始規則模式Production mode建立後立刻貼上本課完整規則;不選 Test mode
資料集合courseScheduleEntries不必手動建立;第一次由教材成功寫入時自動出現

A. 建立自己的 Firebase 課程專案

  1. 開啟 https://console.firebase.google.com/,以自己的課程 Google 帳號登入,按「建立專案/Create a project」。
  2. 專案名稱輸入 wca-schedule-你的GitHub帳號。不要放診所名稱、真實人名、病歷號或其他敏感資訊。
  3. 看到 Project ID 時先核對。這個識別碼建立後不能更改;本課不需要刻意手動改成複雜名稱。
  4. Google Analytics 對本課不是必要功能;若畫面詢問,可以關閉後繼續。Gemini 或其他加值功能也先略過。
  5. 按「建立專案」,等畫面顯示完成,再進入專案總覽。

B. 註冊 Web App,先保留設定畫面

  1. 在 Project overview 按 Web 圖示「</>」;若找不到,進入齒輪 Project settings → General → Your apps,再選 Web。
  2. App nickname 輸入 wca-schedule-web。這個名稱只用來辨識,不是公開網站網址。
  3. 不要勾選 Firebase Hosting;上一課已使用 Vercel 建立網站,本課只加入 Firestore。
  4. 按 Register app。畫面出現 firebaseConfig 物件後先不要關閉;稍後只需要其中六個欄位。
Firebase 官方繁體中文文件的建立 Cloud Firestore 資料庫段落,列出進入 Firebase 控制台、Firestore、Create database、選擇位置與安全規則模式。

建立 Firestore 的官方網頁流程:在 Firebase Console 選 Firestore、Create database、區域與起始規則模式。本課在按 Create 前固定核對 asia-east1 (Taiwan)。

  1. 左上角先確認目前是自己的 wca-schedule 課程專案。
  2. Database ID 使用 (default),Location 使用 asia-east1 (Taiwan)。
  3. 起始選 Production mode;下一步立即替換成教材指定規則。

C. 建立 (default) Firestore 資料庫

  1. 從左側選單進入 Databases & Storage → Firestore Database,按 Create database。
  2. 若畫面詢問 edition 或 mode,選 Standard edition/Native mode;Database ID 保持 (default)。
  3. Location 選 asia-east1 (Taiwan)。資料庫位置建立後不能更換,按下一步前請再讀一次畫面。
  4. 起始規則選 Production mode,不選 Test mode;接著按 Create 建立資料庫。
  5. 資料頁暫時是空的完全正常。現在不要按 Start collection;courseScheduleEntries 會在教材第一次成功寫入時自動建立。

為什麼不選 Test mode?

選項本課做法風險
Production mode選它,再立即發布下方教材規則起始會拒絕 App 存取,直到規則發布完成
Test mode不選暫時全面開放且會到期,容易讓新手誤以為資料庫已安全設定
全域 allow true禁止任何人都可能讀寫整個資料庫;不能拿來解決 permissions 錯誤
Firebase 官方繁體中文文件的使用 Firebase 控制台段落,說明到 Firestore 的規則分頁、在線上編輯器撰寫規則並按發布;下方另列 CLI 方式。

本課只使用畫面上半部的 Firebase Console 路線:Firestore → 規則 → 線上編輯器 → 發布。畫面下方 CLI 是官方的另一種方式,不屬於主課程。

  1. 確認目前是自己的課程 Firebase 專案與正確資料庫。
  2. 只貼入課程當期已審核的 demo 規則,不自行改成全面開放。
  3. 發布後用合成資料驗收;Missing permissions 要查原因,不可拆掉門鎖。

D. 用教材完整規則取代起始規則

  1. 在 Firestore Database 頁切到 Rules/規則分頁,先核對左上角仍是自己的專案與 (default) 資料庫。
  2. 在編輯器內全選並刪除原本的起始規則。不要只把新規則貼在舊規則下方。
  3. 按下方複製按鈕,將整份規則原樣貼入。確認集合名稱是 courseScheduleEntries,最後一段是 allow read, write: if false。
  4. 按 Publish/發布。發布後先等候約一分鐘,再進行教材驗收;不要因短暫 permissions 錯誤改成全面開放。

直接複製:本課唯一允許的 Firestore Rules

必須整份取代 Firebase Console 裡的起始內容並發布。不要省略註解以外的任何一行,也不要把 false 改成 true。

Firestore Rules
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 的六個欄位

  1. 按 Firebase Console 左上角齒輪 → Project settings → General。
  2. 往下找到 Your apps,選剛才建立的 wca-schedule-web。
  3. 在 SDK setup and configuration 選 Config,不選 npm 或 CDN 教學指令。
  4. 準備把 apiKey、authDomain、projectId、storageBucket、messagingSenderId、appId 六個值提供給 Claude。不要提供 service account、私鑰、密碼、token 或驗證碼。

六個欄位要一一對應

Firebase 欄位教材檔案中的欄位常見錯誤
apiKeyapiKey誤以為是 service account 私鑰
authDomainauthDomain漏掉完整網域
projectIdprojectId拿到另一個 Firebase 專案
storageBucketstorageBucket自行猜測或改寫後綴
messagingSenderIdmessagingSenderId和 appId 對調
appIdappId漏貼前後字元

請 Claude App 只填 Firebase Web config

可直接使用的 Prompt
請只修改 `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 頁完成驗收

  1. Claude 修改完成後先看 Review changes:只能有 src/course/firebase.config.ts,而且六個 PASTE_YOUR_ 佔位文字都已被取代。
  2. 在 Claude App 重新啟動 Preview,打開 Preview 網址後在網址最後加上 /course-check。不要另外開 Terminal。
  3. 確認 Firebase Web config 檢查通過,資料模式顯示 Firestore cloud mode,連線狀態顯示 synced。若仍是 localStorage,先看下方排錯表。
  4. 回到排班頁,用「王醫師(虛構)」等合成資料建立一筆班別,重新整理頁面,確認資料仍存在。
  5. 回 Firebase Console → Firestore Database → Data,應看到自動建立的 courseScheduleEntries 集合與一筆文件。不要手動建立其他集合。
  6. 截圖驗收前,確認畫面沒有真實姓名、診所資料、帳號 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 網站並做三裝置驗收。

參考資料

介面與方案會改版;實際操作仍以各工具官方頁面為準。延伸資料用來幫助理解,不取代本課安全原則。

低壓力自我檢查

Preview 顯示 Missing or insufficient permissions,第一個正確動作是?

準備好再標記完成完成狀態會留在這台裝置,下次回來可接著學。