了解 2023 年 Google I/O 大会上介绍的 Firebase 亮点。了解详情

實施自定義 App Check 提供程序

App Check 內置了對多個提供商的支持:Apple 平台上的 DeviceCheck 和 App Attest,Android 上的 Play Integrity 和 SafetyNet,以及網絡應用程序中的 reCAPTCHA v3 和 reCAPTCHA Enterprise(概述)。這些是廣為人知的提供程序,應該可以滿足大多數開發人員的需求。但是,您也可以實施自己的自定義 App Check 提供程序。在以下情況下需要使用自定義提供程序:

  • 您想要使用內置提供程序以外的提供程序。

  • 您希望以不受支持的方式使用內置提供程序。

  • 您想要使用 Apple、Android 和 Web 以外的平台驗證設備。例如,您可以為桌面操作系統或物聯網設備創建 App Check 提供程序。

  • 您希望在任何平台上實施您自己的驗證技術。

概述

要實施自定義 App Check 提供程序,您需要一個可以運行 Node.js Firebase Admin SDK 的安全後端環境。這可以是 Cloud Functions、容器平台(例如Cloud Run)或您自己的服務器。

在此環境中,您將提供可通過網絡訪問的服務,該服務從您的應用程序客戶端接收真實性證明,並且如果真實性證明通過了您的真實性評估,則返回 App Check 令牌。您用作真實性證明的具體指標將取決於您使用的第三方提供商,或者如果您正在實施自定義邏輯,則取決於您自己發明的指標。

通常,您將此服務公開為 REST 或 gRPC 端點,但具體細節由您決定。

創建令牌獲取端點

  1. 安裝並初始化 Admin SDK

  2. 創建一個可以從您的客戶端接收真實性數據的網絡可訪問端點。例如,使用雲函數:

    // Create endpoint at https://example-app.cloudfunctions.net/fetchAppCheckToken
    exports.fetchAppCheckToken = functions.https.onCall((authenticityData, context) => {
      // ...
    });
    
  3. 添加到評估真實性數據的端點邏輯。這是您的自定義 App Check 提供程序的核心邏輯,您需要自己編寫。

  4. 如果您確定客戶端是真實的,請使用 Admin SDK 生成 App Check 令牌並將其及其到期時間返回給客戶端:

    const admin = require('firebase-admin');
    admin.initializeApp();
    
    // ...
    
    admin.appCheck().createToken(appId)
        .then(function (appCheckToken) {
          // Token expires in an hour.
          const expiresAt = Math.floor(Date.now() / 1000) + 60 * 60;
    
          // Return appCheckToken and expiresAt to the client.
        })
       .catch(function (err) {
         console.error('Unable to create App Check token.');
         console.error(err);
       });
    

    如果無法驗證客戶端的真實性,則返回錯誤(例如,返回 HTTP 403 錯誤)。

  5. 可選:通過將AppCheckTokenOptions對像傳遞給createToken()來為您的自定義提供商頒發的 App Check 令牌設置生存時間 (TTL)。您可以將 TTL 設置為 30 分鐘到 7 天之間的任何值。設置此值時,請注意以下權衡:

    • 安全性:較短的 TTL 提供更強的安全性,因為它減少了攻擊者可以濫用洩漏或攔截令牌的窗口。
    • 性能:更短的 TTL 意味著您的應用程序將更頻繁地執行證明。由於每次執行應用證明過程都會增加網絡請求的延遲,因此較短的 TTL 會影響應用的性能。

    1 小時的默認 TTL 對於大多數應用程序來說是合理的。

下一步

現在您已經實現了自定義提供程序的服務器端邏輯,了解如何從您的AppleAndroidWeb客戶端使用它。