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

一、簡介

Firebase App Check 通過確保請求來自合法的應用和設備,幫助保護您的後端資源免遭濫用,例如賬單欺詐和網絡釣魚。它與 Firebase 服務和您自己的後端服務一起使用,以確保您的資源安全。

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

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

你將建造什麼

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

你會學到什麼

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

你需要什麼

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

2.獲取啟動項目

Firebase Quickstarts for iOS 存儲庫包含用於演示不同 Firebase 產品的示例應用程序。您將使用適用於 SwiftUI 的 Firebase 數據庫快速入門應用作為此代碼實驗室的基礎。

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

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

在 Xcode 中打開實時數據庫 SwiftUI Quickstart 應用程序項目:

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. 將 App Check 添加到您的應用

  1. 等待 Swift Package Manager 解決項目的依賴關係。
  2. 打開DatabaseExample (iOS)應用程序目標的常規選項卡。然後,在Frameworks、Libraries 和 Embedded Content部分中,單擊+按鈕。
  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. 在新項目的“項目概覽”屏幕中,單擊“+ 添加應用”按鈕,然後單擊“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 控制台中,導航到控制台的App Check部分。
  2. 單擊開始
  3. “應用程序”選項卡中,單擊您的應用程序以展開其詳細信息。
  4. 單擊App Attest配置 App Attest,然後輸入您的 Apple Developer Account 的團隊 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 模擬器配置調試證明提供程序

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. 在溢出菜單中,選擇管理調試令牌d77c8ff768a00b4b.png
  4. 添加您從 Xcode 控制台複製的密碼,然後單擊保存f845c97b86f694d0.png

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

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

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

9. 為 Firebase 實時數據庫啟用 App Check 強制執行

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

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

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

64e6a81fa979b635.png

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

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

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

要查看 App Check 執行情況,請按照以下步驟操作:

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

下一步

在使用 Firebase Remote Config代碼實驗室逐步推出 Firebase App Check 中了解如何使用 Remote Config 逐步向您的用戶推出 App Check

這些是您可能會覺得有用的其他資源

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