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

一、簡介

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

您可以在 Firebase 文檔中了解有關Firebase 應用檢查的更多信息。

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

您將構建什麼

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

你會學到什麼

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

你需要什麼

  • Xcode 13.3.1 或更高版本
  • 一個 Apple Developer 帳戶,可讓您創建新的應用標識符
  • 支持 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)目標並打開Signing & Capabilities選項卡。
  3. 您應該會看到一條錯誤消息,指出“Signing for DatabaseExample (iOS) requires a development team”
  4. 包標識符更新為唯一標識符。實現此目的的最簡單方法是使用您網站的反向域名,例如com.acme.samples.firebase.quickstart.DatabaseExample (請不要使用此 ID;請選擇您自己的唯一 ID)。
  5. 選擇您的開發團隊。
  6. 當 Xcode 顯示“Provisioning Profile: Xcode Managed Profile”和這個標籤旁邊的一個小信息圖標時,你就會知道一切都很順利。單擊此圖標將顯示有關配置文件的更多詳細信息。

連接您的 iOS 應用程序

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

  1. 在新項目的Project Overview屏幕中,單擊+ Add app按鈕,然後單擊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 控制台中,打開控制台的Authentication部分。
  2. 單擊開始為您的項目設置 Firebase 身份驗證。
  3. 選擇登錄方法選項卡。
  4. 在本機提供程序部分中選擇電子郵件/密碼
  5. 啟用電子郵件/密碼,然後單擊保存

添加測試用戶

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

試一試該應用程序

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

6. 配置 App Attest 證明提供者

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

  1. 在 Firebase 控制台中,導航到控制台的App Check部分。
  2. 單擊開始
  3. 應用程序選項卡中,單擊您的應用程序以展開其詳細信息。
  4. 單擊App Attest配置 App Attest,然後輸入您的 Apple Developer Account 的 Team ID(您可以在 Apple Developer 門戶的Membership部分找到它): 1645f7a369b678c2.png
  5. 單擊保存

這樣,您就有了一個連接到我們的新應用的有效 Firebase 項目,並且啟用了 App Check。

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

7. 為您的應用程序配置 App Attest

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

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

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

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

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

8. 為 iOS 模擬器配置一個 Debug Attestation Provider

Firebase App Check Debug提供程序可以在開發過程中在不受信任的環境(包括 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 控制台,轉到App Check部分。
  2. 應用程序選項卡中,單擊您的應用程序以展開其詳細信息。
  3. 在溢出菜單中,選擇Manage debug tokensd77c8ff768a00b4b.png
  4. 添加您從 Xcode 控制台複製的密鑰,然後單擊保存f845c97b86f694d0.png

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

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

有關此流程的更多詳細信息,請參閱文檔 - 請參閱在 iOS 上通過調試提供程序使用 App Check

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

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

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

  1. App Check部分的 Firebase 控制台中,單擊實時數據庫以展開其詳細信息。
  2. 單擊強制執行

64e6a81fa979b635.png

  1. 閱讀確認對話框中的信息,然後單擊Enforce

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

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

要查看應用檢查實施的實際效果,請執行以下步驟:

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

要重新啟用 App Check,請執行以下操作:

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

10. 恭喜!

9785d32f18b995d2.gif

現在您知道如何:

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

下一步

使用 Firebase 遠程配置代碼實驗室逐步推出 Firebase 應用檢查中了解如何使用遠程配置逐步向您的用戶推出應用檢查

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

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