適用於 Apple 平台的 Firebase 應用檢查

一、簡介

Firebase App Check 確保請求來自合法應用和設備,有助於保護您的後端資源免遭濫用,例如計費欺詐和網絡釣魚。它可與 Firebase 服務和您自己的後端服務配合使用,以確保您的資源安全。

您可以在 Firebase 文檔中了解有關Firebase App Check的更多信息。

應用程序檢查使用特定於平台的服務來驗證應用程序和/或設備的完整性。這些服務稱為證明提供者。 Apple 的App Attest服務就是此類提供商之一,App Check 可以使用該服務來驗證 Apple 應用程序和設備的真實性。

你將構建什麼

在此 Codelab 中,您將在現有示例應用程序中添加並強制執行應用程序檢查,以便保護項目的實時數據庫免遭非法應用程序和設備的訪問。

你將學到什麼

  • 如何將 Firebase App Check 添加到現有應用程序。
  • 如何安裝不同的 Firebase App Check 證明提供商。
  • 如何為您的應用程序配置應用程序證明。
  • 如何配置調試證明提供程序以在應用程序開發期間在模擬器上測試您的應用程序。

你需要什麼

  • Xcode 13.3.1 或更高版本
  • 允許您創建新應用程序標識符的 Apple 開發者帳戶
  • 支持 App Attest 的 iOS/iPadOS 設備(了解App Attest API 可用性

2. 獲取啟動項目

適用於 iOS 的 Firebase 快速入門存儲庫包含用於演示不同 Firebase 產品的示例應用。您將使用適用於 SwiftUI 的 Firebase 數據庫快速入門應用作為此 Codelab 的基礎。

從命令行克隆Firebase Quickstarts for iOS 存儲庫

git clone https://github.com/firebase/quickstart-ios.git
cd quickstart-ios

在 Xcode 中打開實時數據庫 SwiftUI 快速入門應用程序項目:

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. 將應用程序檢查添加到您的應用程序中

  1. 等待 Swift Package Manager 解決項目的依賴關係。
  2. 打開DatabaseExample (iOS)應用程序目標的常規選項卡。然後,在“框架、庫和嵌入式內容”部分中,單擊+按鈕。
  3. 選擇添加FirebaseAppCheck

4. 創建並安裝 App Check 提供程序工廠

  1. Shared文件組中,添加一個名為AppCheck的新組。
  2. 在該組內,在單獨的文件中創建一個工廠類,例如MyAppCheckProviderFactory.swift ,確保將其添加到DatabaseExample (iOS)目標:
    import Firebase
    
    class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
      func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
        #if targetEnvironment(simulator)
          // App Attest is not available on simulators.
          // Use a debug provider.
          return AppCheckDebugProvider(app: app)
        #else
          // Use App Attest provider on real devices.
          return AppAttestProvider(app: app)
        #endif
      }
    }
    
  3. 接下來,在DatabaseExampleApp.swift中,確保導入FirebaseAppCheck ,並將MyAppCheckProviderFactory類的實例設置為 App Check 提供程序工廠。
    import SwiftUI
    import FirebaseCore
    import FirebaseAppCheck
    
    @main
    struct DatabaseExampleApp: App {
      init() {
        // Set an instance of MyAppCheckProviderFactory as an App Check
        // provider factory before configuring Firebase.
        AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
        FirebaseApp.configure()
      }
      ...
    }
    

5. 創建並配置 Firebase 項目

要在 iOS 項目中使用 App Check,您需要在 Firebase 控制台中執行以下步驟:

  • 設置 Firebase 項目。
  • 將您的 iOS 應用添加到 Firebase 項目。
  • 配置 Firebase 身份驗證。
  • 初始化您要保護的實時數據庫實例。
  • 配置應用程序檢查。

創建一個項目

首先,您需要創建一個 Firebase 項目。

  1. Firebase 控制台中,選擇添加項目
  2. 將您的項目命名為App Check Codelab
  3. 單擊繼續。
  4. 為此項目禁用 Google Analytics,然後單擊“創建項目”。

創建實時數據庫實例

現在,導航到 Firebase 控制台的實時數據庫部分。

  1. 單擊“創建數據庫”按鈕開始數據庫創建工作流程。
  2. 保留數據庫的默認位置 ( us-central1 ) 不變,然後單擊Next
  3. 確保選擇“鎖定模式”並單擊“啟用”按鈕以啟用數據庫的安全規則。
  4. 導航到實時數據庫瀏覽器的“規則”選項卡,並將默認規則替換為以下內容:
    {
        "rules": {
            // User profiles are only readable/writable by the user who owns it
            "users": {
                "$UID": {
                    ".read": "auth.uid == $UID",
                    ".write": "auth.uid == $UID"
                }
            },
            // Posts can be read by anyone but only written by logged-in users.
            "posts": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    // UID must match logged in user and is fixed once set
                    "uid": {
                        ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                    },
                    // User can only update own stars
                    "stars": {
                        "$UID": {
                            ".validate": "auth.uid == $UID"
                        }
                    }
                }
            },
            // User posts can be read by anyone but only written by the user that owns it,
            // and with a matching UID
            "user-posts": {
                ".read": true,
                "$UID": {
                    "$POSTID": {
                        ".write": "auth.uid == $UID",
                        ".validate": "data.exists() || newData.child('uid').val() == auth.uid"
                    }
                }
            },
            // Comments can be read by anyone but only written by a logged in user
            "post-comments": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    "$COMMENTID": {
                        // UID must match logged in user and is fixed once set
                        "uid": {
                            ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                        }
                    }
                }
            }
        }
    }
    
  5. 單擊“發布”按鈕激活更新的安全規則。

準備您的 iOS 應用程序以連接到 Firebase

為了能夠在物理設備上運行示例應用程序,您需要將項目添加到您的開發團隊,以便 Xcode 可以為您管理所需的配置文件。請按照以下步驟將示例應用程序添加到您的開發者帳戶:

  1. 在 Xcode 中,在項目導航器中選擇DatabaseExample項目。
  2. 選擇DatabaseExample (iOS)目標並打開“簽名和功能”選項卡。
  3. 您應該會看到一條錯誤消息,指出“Signing for DatabaseExample (iOS)需要開發團隊”
  4. 包標識符更新為唯一標識符。實現此目的的最簡單方法是使用網站的反向域名,例如com.acme.samples.firebase.quickstart.DatabaseExample (請不要使用此 ID;請選擇您自己的唯一 ID)。
  5. 選擇您的開發團隊。
  6. 當 Xcode 顯示“Provisioning Profile: Xcode Managed Profile”以及該標籤旁邊的小信息圖標時,您就會知道一切進展順利。單擊此圖標將顯示有關配置文件的更多詳細信息。

連接您的 iOS 應用程序

有關連接應用程序的深入說明,請查看有關將 Firebase 添加到 iOS 項目的文檔。首先,請在 Firebase 控制台中執行以下主要步驟:

  1. 在新項目的“項目概述”屏幕中,單擊+ 添加應用程序按鈕,然後單擊iOS+圖標,將新的 iOS 應用程序添加到您的 Firebase 項目。
  2. 輸入應用程序的捆綁 ID(使用您在上一節中定義的 ID,例如com.acme.samples.firebase.quickstart.DatabaseExample - 請記住,這必須是唯一標識符)
  3. 單擊註冊應用程序
  4. Firebase 會生成一個GoogleService-Info.plist文件,其中包含您的應用所需的所有 Firebase 元數據。
  5. 單擊“下載 GoogleService-Info.plist”以下載該文件。
  6. 在 Xcode 中,您將看到該項目已包含一個名為GoogleService-Info.plist的文件。首先刪除此文件 - 您將在下一步中將其替換為您自己的 Firebase 項目的文件。
  7. 將您在上一步中下載的GoogleService-Info.plist文件複製到 Xcode 項目的根文件夾中,並將其添加到DatabaseExample (iOS)目標,確保其名為GoogleService-Info.plist
  8. 單擊完成註冊流程的其餘步驟。由於示例項目已正確設置,因此您無需對代碼進行任何更改。

配置 Firebase 身份驗證

唷!到目前為止,設置已經相當多了,但請堅持住!如果您是 Firebase 新手,那麼您已經了解了工作流程的重要部分,並且很快就會熟悉。

現在,您將為該應用配置 Firebase 身份驗證。

啟用身份驗證電子郵件/密碼登錄提供商

  1. 仍在Firebase 控制台中,打開控制台的“身份驗證”部分。
  2. 單擊開始為您的項目設置 Firebase 身份驗證。
  3. 選擇登錄方法選項卡。
  4. 本機提供商部分中選擇電子郵件/密碼
  5. 啟用電子郵件/密碼並單擊保存

添加測試用戶

  1. 打開“身份驗證”部分的“用戶”選項卡。
  2. 單擊添加用戶
  3. 為您的測試用戶指定電子郵件和密碼,然後單擊“添加用戶”

試用一下該應用程序

返回 Xcode,並在 iOS 模擬器上運行該應用程序。使用您剛剛創建的測試用戶的電子郵件和密碼登錄。登錄後,創建帖子、對現有帖子發表評論以及為帖子添加星標/取消星標。

6. 配置 App Attest 證明提供程序

在此步驟中,您將配置 App Check 以在 Firebase 控制台中使用 App Attest 提供程序。

  1. 在 Firebase 控制台中,導航到控制台的“應用檢查”部分。
  2. 單擊開始
  3. “應用程序”選項卡中,單擊您的應用程序以展開其詳細信息。
  4. 單擊“App Attest”以配置“App Attest”,然後輸入您的 Apple 開發者帳戶的團隊 ID(您可以在 Apple 開發者門戶的“會員資格”部分找到此信息): 1645f7a369b678c2.png
  5. 單擊“保存”

這樣,您就有了一個連接到我們的新應用程序的工作 Firebase 項目,並且啟用了應用程序檢查。

您現在已準備好配置我們的特定證明服務!有關此工作流程的更多信息,請參閱在 iOS 上使用應用程序證明啟用應用程序檢查

7. 為您的應用程序配置應用程序證明

現在是時候開始使用 Firebase App Check SDK 並實現一些客戶端代碼了。

首先,您需要配置 Xcode 項目,以便 SDK 可以使用 Apple 的 App Attest API 來確保從您的應用程序發送的請求來自您的應用程序的合法實例。

  1. 在 Xcode 項目中為您的應用程序目標添加應用程序證明功能:
  2. 打開應用程序目標設置中的“簽名和功能”選項卡
  3. 單擊“ + ”按鈕
  4. 在對話框中,找到並選擇應用程序證明功能ae84cd988a5fab31.png
  5. 執行上一步後DatabaseExample (iOS).entitlements文件將出現在 Xcode 項目的根文件夾中。
  6. DatabaseExample (iOS).entitlements文件中,將App Attest Environment密鑰的值更改為production.

完成這些步驟並在物理iOS 設備 (iPhone/iPad) 上啟動應用程序後,該應用程序仍然能夠訪問實時數據庫。在後面的步驟中,您將強制執行應用程序檢查,這將阻止從非法應用程序和設備發送的請求。

要了解有關此工作流程的更多信息,請參閱在 iOS 上使用 App Attest 啟用應用程序檢查

8. 為 iOS 模擬器配置調試證明提供程序

Firebase App Check 調試提供程序可以在開發過程中在不受信任的環境(包括 iOS 模擬器)中通過 Firebase App Check 強制執行來測試應用程序。接下來,您需要一起配置調試提供程序。

在您的應用中安裝 Firebase 調試提供程序

選項 1:有條件地在工廠中創建調試提供程序的實例

當您創建 App Check 提供程序工廠時,您完成了大部分工作。在此步驟中,您將添加調試提供程序生成的本地調試密鑰的日誌記錄,以便您可以在 Firebase 控制台中註冊應用程序的此實例以進行調試。

使用以下代碼更新MyAppCheckProviderFactory.swift

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
#if targetEnvironment(simulator)
    // App Attest is not available on simulators.
    // Use a debug provider.
    let provider = AppCheckDebugProvider(app: app)

    // Print only locally generated token to avoid a valid token leak on CI.
    print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

    return provider
#else
    // Use App Attest provider on real devices.
    return AppAttestProvider(app: app)
#endif
  }
}

這種方法使我們能夠根據環境更靈活地配置 App Check。例如,您可以在App Attest不可用的操作系統版本上使用其他證明提供程序(例如DeviceCheck)或自定義證明提供程序。請參閱下面的示例:

import Firebase

class MyAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
  func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
      #if targetEnvironment(simulator)
      // App Attest is not available on simulators.
      // Use a debug provider.
      let provider = AppCheckDebugProvider(app: app)

      // Print only locally generated token to avoid a valid token leak on CI.
      print("Firebase App Check debug token: \(provider?.localDebugToken() ?? "" )")

      return provider
      #else
      if #available(iOS 14.0, *) {
        // Use App Attest provider on real devices.
        return AppAttestProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

選項 2:安裝AppCheckDebugProviderFactory

對於更簡單的情況,您可以在配置 Firebase 應用程序實例之前臨時或有條件地安裝AppCheckDebugProviderFactory

init() {
#if targetEnvironment(simulator)
  let providerFactory = AppCheckDebugProviderFactory()
#else
  let providerFactory = MyAppCheckProviderFactory()
#endif

  AppCheck.setAppCheckProviderFactory(providerFactory)

  FirebaseApp.configure()
}

這將為您節省創建自己的 App Check 提供程序工廠時的幾行代碼。

在 Firebase 控制台中註冊您的調試密鑰

從您的 iOS 模擬器獲取調試秘密

  1. 如果您選擇安裝AppCheckDebugProviderFactory (上面的選項 2),則需要通過將-FIRDebugEnabled添加到應用程序啟動參數來啟用應用程序的調試日誌記錄: f1c6b477a373e144.png
  2. 在模擬器上運行您的應用程序
  3. 在 Xcode 控制台中找到調試密碼。您可以使用控制台過濾器更快地找到它: d4c65af93e369c55.png

注意:調試密碼是在第一次應用程序啟動時為模擬器生成的,並存儲在用戶默認值中。如果刪除應用程序、重置模擬器或使用其他模擬器,將生成新的調試密鑰。確保註冊新的調試密碼。

註冊調試秘密

  1. 返回 Firevbase 控制台,轉到應用程序檢查部分。
  2. “應用程序”選項卡中,單擊您的應用程序以展開其詳細信息。
  3. 在溢出菜單中,選擇管理調試令牌d77c8ff768a00b4b.png
  4. 添加從 Xcode 控制台複製的密鑰,然後單擊“保存” f845c97b86f694d0.png

完成這些步驟後,即使強制執行應用程序檢查,您也可以在模擬器上使用該應用程序。

注意:調試提供程序專門設計用於幫助防止調試秘密洩漏。使用當前方法,您不需要將調試機密存儲在源代碼中。

有關此流程的更多詳細信息可以在文檔中找到 - 請參閱在 iOS 上使用 App Check 與調試提供程序

9. 為 Firebase 實時數據庫啟用應用程序檢查強制執行

目前,我們的應用程序聲明了一個AppCheckProviderFactory ,它返回真實設備的AppAttestProvider 。在物理設備上運行時,您的應用將執行證明並將結果發送到 Firebase 後端。但是,Firebase 後端仍然接受來自任何設備、iOS 模擬器、腳本等的請求。當您仍然有用戶使用舊版本的應用而沒有應用檢查,並且您不想強制訪問時,此模式非常有用尚未檢查。

現在,您需要啟用應用程序檢查強制執行,以確保只能從合法設備訪問 Firebase 應用程序。一旦您為 Firebase 項目啟用強制執行,未集成 App Check 的舊應用程序版本將停止工作。

  1. 在 Firebase 控制台的“應用檢查”部分中,單擊“實時數據庫”以展開其詳細信息。
  2. 單擊“強制”

64e6a81fa979b635.png

  1. 閱讀確認對話框中的信息,然後單擊“強制”

完成這些步驟後,只有合法的應用程序才能訪問數據庫。所有其他應用程序都將被阻止。

嘗試使用非法應用程序訪問實時數據庫

要查看應用程序檢查的實際執行情況,請按照以下步驟操作:

  1. 通過在DatabaseExampleApp中應用程序入口點的init方法中註釋掉 App Check 註冊代碼來關閉 App Check 註冊。
  2. 通過選擇“設備”>“擦除所有內容和設置”來重置模擬器。這將擦除模擬器(並使設備令牌無效)。
  3. 在模擬器上再次運行該應用程序。
  4. 您現在應該看到以下錯誤消息:
    [FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server.  Will not attempt reconnect. Reason: Invalid appcheck token.
    

要重新啟用應用程序檢查,請執行以下操作:

  1. 取消DatabaseExampleApp中 App Check 註冊代碼的註釋。
  2. 重新啟動應用程序。
  3. 記下 Xcode 控制台中新的 App Check 令牌。
  4. 在 Firebase 控制台的應用程序檢查設置中註冊調試令牌。
  5. 重新運行應用程序。
  6. 您應該不再看到錯誤消息,並且應該能夠在應用程序中添加新的帖子和評論。

10. 恭喜!

9785d32f18b995d2.gif

現在您知道如何:

  • 將 App Check 添加到現有項目
  • 為應用程序的生產版本配置 App Attest 證明提供程序
  • 配置調試證明提供程序以在模擬器上測試您的應用程序
  • 觀察應用版本發布,了解何時對您的 Firebase 項目實施應用檢查
  • 啟用應用程序檢查強制執行

下一步

在使用 Firebase Remote Config 逐步推出 Firebase App Check Codelab 中了解如何使用 Remote Config 逐步向用戶推出 App Check

這些是您可能會發現有用的其他資源

此 Codelab 中描述的設置適用於大多數情況,但 App Check 可以根據需要為您提供更大的靈活性 - 請查看以下鏈接以了解更多詳細信息: