iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0
Security

『零信任』的革命:從 FIDO 協議到自動化部署,30天打造次世代身分認證系統系列 第 8

Day 08: 【後端起手式】Firebase Functions:打造 Serverless FIDO 後端服務

  • 分享至 

  • xImage
  •  

前言:進入後端實作階段

根據我們在第一週定版的系統設計與 API 規格,第二階段的核心目標是實現 FIDO/WebAuthn 的後端邏輯。為此,我們選定 Firebase Functions 作為後端技術棧。

Firebase Functions 是 Google Cloud Platform (GCP) 生態系中的 Functions-as-a-Service (FaaS) 解決方案。選擇它的主要技術優勢包括:

  • Serverless 架構: 開發者只需專注於業務邏輯的程式碼,無需管理底層的伺服器、作業系統或網路環境。GCP 會自動處理資源調度、擴展與維護。
  • 事件驅動: Functions 可以由 HTTPS 請求、資料庫操作、檔案上傳等多種事件觸發,非常適合構建反應式的微服務。
  • 整合性: 與 Firestore 資料庫、Firebase Authentication 等服務原生整合,能大幅簡化開發流程。
  • 成本效益: 採用按需付費模型,僅在函式執行時產生費用,閒置期間無成本。

今天的任務是完成 Firebase 專案的建立、初始化本地開發環境,並成功部署一個基礎的 HTTP 觸發函式,以驗證整個開發與部署流程的通暢性。


章節一:環境準備與 Firebase CLI 安裝

在開始之前,請確保您的開發環境已具備以下工具:

  1. Node.js: 請安裝 18.x 或更高版本的 LTS (長期支援) 版本。
  2. Google 帳戶: 用於建立 Firebase/GCP 專案。
  3. 程式碼編輯器: 例如 Visual Studio Code 或 Cursor。

接下來,我們需要安裝 Firebase Command Line Interface (CLI),
這是一個用於管理、部署 Firebase 專案的關鍵工具。

開啟終端機 Terminal,執行以下指令進行全域安裝:

npm install -g firebase-tools

安裝完成後,可以執行 firebase --version 來確認 CLI 是否安裝成功。


章節二:建立 Firebase 專案

所有 Firebase 服務都需要依附於一個專案。請依照以下步驟建立:

  1. 前往 Firebase Console
  2. 點擊「新增專案」(Add project)。
  3. 輸入專案名稱,例如 fido-auth-ironman
  4. 系統會詢問是否要為專案啟用 Google Analytics。在此專案中,此功能非必要,可以選擇性關閉以簡化設置。
  5. 點擊「建立專案」(Create project)。

等待數分鐘後,您的專案即可準備就緒。請注意,每個 Firebase 專案在底層都對應一個 GCP 專案,具備完整的 GCP 服務存取權限。


章節三:初始化本地專案目錄

專案建立後,我們需要在本地電腦上建立一個對應的工作目錄並將其與雲端專案連結。

  1. 建立並進入專案目錄

    mkdir fido-server-functions && \
    cd fido-server-functions
    
  2. 登入 Firebase:
    執行 firebase login 指令。這會開啟瀏覽器,引導您登入 Google 帳戶並授權 Firebase CLI。

  3. 初始化 Firebase 功能:
    在專案目錄中,執行 firebase init。CLI 會引導您完成一系列設定:

    • Which Firebase features do you want to set up?
      • 選擇: FunctionsFirestore。(使用方向鍵移動,空白鍵選取)
    • Please select an option:
      • 選擇: Use an existing project,然後從列表中選取您剛剛建立的專案。
    • What language would you like to use to write Cloud Functions?
      • 選擇: TypeScript。我們選擇 TypeScript 是因為其強型別特性有助於在開發階段捕捉潛在錯誤,對於處理複雜的 FIDO 數據結構尤其重要。
    • Do you want to use ESLint to catch probable bugs and enforce style?
      • 回答: Yes。遵循程式碼規範是良好實踐。
    • Do you want to install dependencies with npm now?
      • 回答: Yes。CLI 會自動安裝所需的 Node.js 模組。

完成後,您的專案目錄將生成以下結構:

fido-server-functions/
├── functions/              # 所有 Cloud Functions 程式碼存放於此
│   ├── src/
│   │   └── index.ts        # Functions 的主要進入點
│   ├── package.json
│   └── tsconfig.json
├── firestore.rules         # Firestore 安全規則文件
└── firebase.json           # Firebase 專案設定檔

章節四:編寫並部署第一個 HTTP Function

為了驗證我們的環境配置無誤,我們將編寫一個簡單的 "Hello World" 函式並將其部署到雲端。

  1. 編輯程式碼
    打開 functions/src/index.ts 檔案,並用以下內容覆蓋:

    import * as functions from "firebase-functions/v2";
    import * as logger from "firebase-functions/logger";
    
    // 建立一個由 HTTP 請求觸發的 v2 函式
    // region 'asia-east1' 指定函式部署在台灣的 GCP 資料中心
    export const helloWorld = functions.https.onRequest(
        { region: "asia-east1" },
        (request, response) => {
            // 記錄日誌,方便在 GCP Console 中進行偵錯
            logger.info("Hello World function was triggered!");
            response.status(200).send("Hello from Firebase FIDO Server!");
        }
    );
    

    我們使用的是 v2 版本的 Functions,其語法和配置更為現代化。同時指定部署區域有助於降低延遲。

  2. 部署函式
    回到終端機,在專案根目錄下執行部署指令:

    firebase deploy --only functions
    

    此指令會將 functions 目錄下的 TypeScript 程式碼編譯為 JavaScript,打包後上傳至 Cloud Functions 執行環境。

    首次部署需要幾分鐘時間。成功後,終端機會顯示該函式的公開存取 URL,格式如下:
    Function URL (helloWorld(asia-east1)): https://helloworld-....asia-east1.run.app

  3. 驗證結果
    使用 curl 或直接在瀏覽器中訪問上述 URL,您應該會收到 "Hello from Firebase FIDO Server!" 的回應,這代表您的 Serverless 後端環境已成功啟動並運行。


已完成後端基礎

今天,我們成功地建立並配置了一個功能齊全、基於雲端的 Serverless 後端開發環境。我們在沒有接觸任何虛擬主機、網路設定或作業系統配置的情況下,僅用幾行指令就部署了一個公開的 Web API 端點。

這個輕量且強大的基礎設施,將是我們未來幾天實作 FIDO 伺服器邏輯的基石。下一步,我們將根據 Day 06 的設計,開始在 Firestore 中規劃我們的資料庫結構,並定義嚴格的安全規則,為安全地儲存使用者憑證做好準備。


上一篇
Day 07: 【第一週回顧】技術基礎與系統設計定版
下一篇
Day 09: 【數據庫安全】Firestore 的安全規則與資料庫結構設計
系列文
『零信任』的革命:從 FIDO 協議到自動化部署,30天打造次世代身分認證系統9
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言