ทยอยเปิดตัว Firebase App Check โดยใช้ Firebase Remote Config

1. บทนำ

คุณสามารถใช้ Firebase App Check กับ App Attest เพื่อปกป้องบริการแบ็กเอนด์ของคุณและตรวจสอบว่าคำขอไปยังบริการ Firebase นั้นมาจากแอปจริงของคุณ

โดยทั่วไป แนะนำให้ค่อยๆ แนะนำให้ผู้ใช้เริ่มใช้บริการ App Attest เพื่อหลีกเลี่ยงการใช้โควต้าเกินขีดจำกัด สำหรับข้อมูลเพิ่มเติม โปรดดูเอกสารประกอบ " การเตรียมใช้งาน App Attest Service " ของ Apple

ความสามารถในการเผยแพร่การอัปเดตแอปแบบค่อยเป็นค่อยไปโดยใช้คุณลักษณะ App Store Connect ของ Apple ตามที่อธิบายไว้ใน " การเผยแพร่การอัปเดตเวอร์ชันเป็นระยะๆ " สามารถทำให้การเปิดตัว App Check ราบรื่นขึ้น นี่เป็นวิธีแก้ปัญหาง่ายๆ อย่างไรก็ตาม การเผยแพร่การอัปเดตเวอร์ชันแอปเป็นขั้นๆ ไม่อนุญาตให้คุณควบคุมการเปิดตัวหรือเปลี่ยนแปลงพฤติกรรมของแอปที่มีอยู่และอัปเดตโดยไม่ต้องเผยแพร่แอปเวอร์ชันใหม่

วิธีหนึ่งที่จะควบคุมการเปิดตัว App Check with App Attest ได้มากขึ้นคือการใช้ Firebase Remote Config เพื่อเปิดใช้ App Check with App Attest สำหรับเปอร์เซ็นต์ของผู้ใช้แอปในแต่ละครั้ง สิ่งนี้อาจช่วยหลีกเลี่ยงการควบคุมปริมาณจากเซิร์ฟเวอร์การรับรอง สามารถใช้ Google Analytics เพื่อสังเกตผลกระทบของการเปิดตัวต่อผู้ใช้

สิ่งที่คุณจะได้เรียนรู้

ใน Codelab แบบหลายขั้นตอนนี้ คุณจะได้เรียนรู้วิธีใช้ Firebase Remote Config เพื่อเปิดตัว App Check สำหรับแอปของคุณ

Codelab นี้ใช้โปรเจ็กต์ Firebase ที่อิงตามแอป Quickstart DatabaseExample และรวมเข้ากับ Firebase App Check ตามที่อธิบายไว้ใน Codelab ของ Firebase App Check สำหรับ Apple Platforms แอป Quickstart DatabaseExample ช่วยให้ผู้ใช้เข้าสู่ระบบและเพิ่มโพสต์โดยใช้คุณสมบัติของ Firebase Realtime Database

คุณยังสามารถปรับขั้นตอนใน Codelab นี้เพื่อทดสอบแอปของคุณเอง

ข้อกำหนดเบื้องต้น

สิ่งที่คุณต้องการ

  • Xcode 12.5+
  • สำหรับการทดสอบ App Attest:
  • โครงการ Firebase ด้วย:
  • เข้าถึงโปรเจ็กต์ Firebase ที่เชื่อมโยงกับแอปของคุณ โดยมีสิทธิ์ในการสร้างและจัดการการกำหนดค่าระยะไกลและดู Google Analytics

2. สร้างผู้ให้บริการรับรองที่กำหนดเอง

ในขั้นตอนนี้ เราจะสร้างคลาสผู้ให้บริการแบบกำหนดเองเพื่อจัดเตรียมโทเค็นเมื่อเปิดใช้งาน App Attest เท่านั้น การกำหนดค่าระยะไกลอาศัยอินสแตนซ์ของแอป Firebase ที่กำหนดค่าไว้ และผู้ให้บริการแบบกำหนดเองที่คุณใช้ในขั้นตอนนี้ทำหน้าที่เป็นตัวยึดตำแหน่งเพื่อเสร็จสิ้นการกำหนดค่า

ในการทำตามขั้นตอนต่อไปนี้ คุณจะต้องเพิ่ม Firebase , FirebaseRemoteConfig และ FirebaseAnalytics ใน ส่วน Frameworks, Libraries และ Embedded Content ของแอปของคุณใน Xcode สำหรับตัวอย่างวิธีการ โปรดดู การตรวจสอบแอป Firebase สำหรับ Codelab ของแพลตฟอร์ม Apple

  1. สร้างไฟล์ " MyAppCheckProvider " ซึ่งเป็นคลาสย่อยของ NSObject ที่สอดคล้องกับโปรโตคอล AppCheckProvider
  2. รวมเมธอด getToken() ว่างที่คุณจะกรอกในภายหลัง

ดูโค้ดตัวอย่างต่อไปนี้สำหรับคลาสผู้ให้บริการที่กำหนดเองด้วยเมธอด getToken() ที่ว่างเปล่า

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

ในการยกตัวอย่าง AppAttestProvider คุณจะต้องผ่านอินสแตนซ์ของ FirebaseApp ที่เกี่ยวข้อง สร้างคุณสมบัติที่เก็บไว้และยอมรับเป็นพารามิเตอร์ initializer:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

ส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest

ตอนนี้คุณมีทุกอย่างที่จะส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest ในเมธอด getToken() ของคุณ

หมายเหตุ: เรียนรู้เพิ่มเติมเกี่ยวกับเมธอด getToken() ใน FirebaseAppCheck Framework Reference

เพิ่มรหัสต่อไปนี้ในเมธอด getToken() ของคุณ:

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  // Firebase app instance served by the provider.
  let firebaseApp: FirebaseApp

  // The App Check provider factory should pass the FirebaseApp instance.
  init(app: FirebaseApp) {
    self.firebaseApp = app
    super.init()
  }

  private lazy var appAttestProvider = AppAttestProvider(app: firebaseApp)

  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
    // Fetch App Attest flag from Remote Config
    let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
    remoteConfig.fetchAndActivate { remoteConfigStatus, error in
      // Get App Attest flag value
      let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

      guard appAttestEnabled else {
        // Skip attestation if App Attest is disabled. Another attestation
        // method like DeviceCheck may be used instead of just skipping.
        handler(nil, MyProviderError.appAttestIsDisabled)
        return
      }

      // Try to obtain an App Attest provider instance and fail if cannot
      guard let appAttestProvider = self.appAttestProvider else {
        handler(nil, MyProviderError.appAttestIsUnavailable)
        return
      }

      // If App Attest is enabled for the app instance, then forward the
      // Firebase App Check token request to the App Attest provider
      appAttestProvider.getToken(completion: handler)
    }
  }
}

enum MyProviderError: Error {
  case appAttestIsDisabled
  case appAttestIsUnavailable
  case unexpected(code: Int)
}

โค้ดก่อนหน้านี้ตรวจสอบพารามิเตอร์บูลีน AppAttestEnabled Remote Config (พารามิเตอร์ Remote Config นี้จะสร้างขึ้นภายหลังใน Codelab) หากค่าเป็นเท็จ รหัสจะล้มเหลว ซึ่งบ่งชี้ว่าการตรวจสอบแอปไม่ได้เริ่มใช้งานในอุปกรณ์ปัจจุบัน หากค่าเป็นจริง รหัสจะพยายามขอรับผู้ให้บริการ App Attest และจะล้มเหลวหากไม่สามารถ หากผ่านการตรวจสอบข้อผิดพลาดเหล่านี้ รหัสจะส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest

เพิ่มเหตุการณ์ Analytics

เมื่อเพิ่มเหตุการณ์ Analytics คุณจะได้รับข้อมูลเชิงลึกที่ดีขึ้นว่าการเปิดตัว App Check ประสบความสำเร็จเพียงใด การวิเคราะห์จะช่วยตัดสินว่าควรเปิดใช้ App Attest สำหรับผู้ชมจำนวนมากขึ้นหรือไม่

บันทึกเหตุการณ์ Analytics สองเหตุการณ์: AppAttestSuccess เมื่อสำเร็จ และ AppAttestFailure เมื่อล้มเหลว เหตุการณ์ Analytics ทั้งสองนี้สามารถช่วยติดตามความสำเร็จของการเปิดตัว App Check และช่วยให้คุณตัดสินใจได้ว่าควรเปิดตัวขนาดใหญ่ขึ้นต่อไปหรือไม่

func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {
  // Fetch Remote Config.
  let remoteConfig = RemoteConfig.remoteConfig(app: firebaseApp)
  remoteConfig.fetchAndActivate { remoteConfigStatus, error in
    // Get App Attest flag value from Remote Config.
    let appAttestEnabled = remoteConfig.configValue(forKey: "AppAttestEnabled").boolValue

    guard appAttestEnabled else {
      // Skip attestation if App Attest is disabled. Another attestation
      // method like DeviceCheck may be used instead of just skipping.
      handler(nil, MyProviderError.appAttestIsDisabled)
      return
    }

    // Try to obtain an App Attest provider instance and fail otherwise.
    guard let appAttestProvider = self.appAttestProvider else {
      handler(nil, MyProviderError.appAttestIsUnavailable)
      return
    }

    // If App Attest is enabled for the app instance, then forward the
    // Firebase App Check token request to the App Attest provider.
    appAttestProvider.getToken { token, error in
      // Log an Analytics event to track attestation success rate.
      let appAttestEvent: String
      if (token != nil && error == nil) {
        appAttestEvent = "AppAttestSuccess"
      } else {
        appAttestEvent = "AppAttestFailure"
      }
      Analytics.logEvent(appAttestEvent, parameters: nil)

      // Pass the result to the handler
      handler(token, error)
    }
  }
}

3. อัปเดตคลาส Provider Factory

หลังจากที่คุณใช้ตรรกะเพื่อส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest และเพิ่มเหตุการณ์ Analytics บางอย่างแล้ว คุณต้องอัปเดต MyAppCheckProviderFactory.class ซึ่งคุณสร้างไว้ใน Codelab ของ App Check สำหรับ Apple Platforms คลาสนี้จะกำหนดเป้าหมาย ผู้ให้บริการแก้ไขข้อบกพร่องของ App Check สำหรับเครื่องจำลอง และกำหนดเป้าหมายผู้ให้บริการที่กำหนดเองของคุณ

แก้ไขโค้ดต่อไปนี้ในคลาส MyAppCheckProviderFactory ที่คุณสร้างใน Codelab ของ Firebase App Check สำหรับแพลตฟอร์ม Apple :

// 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
      if #available(iOS 14.0, *) {
        // Use your custom App Attest provider on real devices.
        return MyAppCheckProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

ยืนยันว่าคุณได้ตั้งค่า AppCheckProviderFactory ก่อนกำหนดค่า FirebaseApp :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. เพิ่มพารามิเตอร์การกำหนดค่าระยะไกลในคอนโซล Firebase

ตอนนี้ คุณจะเพิ่มพารามิเตอร์การกำหนดค่าระยะไกล AppAttestEnabled ไปยังคอนโซล Firebase เมธอด getToken ของคุณต้องการพารามิเตอร์นี้

วิธีสร้างพารามิเตอร์ Remote Config ในคอนโซล Firebase :

  1. เปิด การกำหนดค่าระยะไกล สำหรับโครงการของคุณ แล้วคลิก เพิ่มพารามิเตอร์ หากนี่เป็นครั้งแรกที่คุณใช้ Remote Config ให้คลิก Create configuration
  2. ในฟิลด์ ชื่อพารามิเตอร์ (คีย์) ให้ป้อน AppAttestEnabled
  3. จากดรอปดาวน์ ประเภทข้อมูล ให้เลือก บูลีน
  4. จาก ดรอปดาวน์ค่า เริ่มต้น เลือก เท็จ

การสร้างพารามิเตอร์การกำหนดค่าระยะไกลในคอนโซล Firebase

ก่อนคลิกบันทึก ให้สร้างมูลค่าตามเงื่อนไขสำหรับผู้ใช้ 10%:

  1. คลิก เพิ่มใหม่ > ค่าเงื่อนไข > สร้างเงื่อนไขใหม่
  2. ในฟิลด์ ชื่อ ให้ป้อนชื่อเงื่อนไข
  3. ภายใต้ ใช้ if... เลือก ผู้ใช้ในเปอร์เซ็นต์ไทล์สุ่ม <= แล้วป้อน 10 ในฟิลด์ %
  4. คลิก สร้างเงื่อนไข

การกำหนดเงื่อนไขการกำหนดค่าระยะไกลในคอนโซล Firebase

ตั้งค่าเงื่อนไขเป็น จริง เพื่อให้ App Attest ใช้งานได้กับผู้ใช้ 10%

  1. ตั้งค่าเป็น จริง สำหรับเงื่อนไขที่คุณเพิ่งสร้างขึ้น
  2. คลิก บันทึก

การตรวจสอบพารามิเตอร์การกำหนดค่าระยะไกลในคอนโซล Firebase

เมื่อคุณทำเสร็จแล้ว ให้เผยแพร่การเปลี่ยนแปลงการกำหนดค่าระยะไกล

ทดสอบการเปิดตัวบนอุปกรณ์ของคุณ

หากต้องการทดสอบค่าแฟล็กการกำหนดค่าระยะไกลที่แตกต่างกันบนอุปกรณ์ของคุณโดยไม่แก้ไขโค้ดแอป ให้กำหนดค่าการทดสอบบนพารามิเตอร์ AppAttestEnabled ตาม บทช่วยสอนสร้างการทดสอบการกำหนดค่าระยะไกลของ Firebase ด้วย A/B Testing ส่วนบทช่วยสอน " ตรวจสอบความถูกต้องของการทดสอบบนอุปกรณ์ทดสอบ " อธิบายวิธีกำหนดค่าต่างๆ สำหรับอุปกรณ์ทดสอบของคุณ

ขั้นตอนสุดท้ายคือการใช้ Google Analytics เพื่อตรวจสอบความสำเร็จของการเปิดตัว App Attest

5. ตรวจสอบความสำเร็จของการเปิดตัว AppCheck ของคุณ

คุณสามารถวัดความสำเร็จของการเปิดตัวของคุณได้บนแดชบอร์ดเหตุการณ์ของ Analytics ดูเหตุการณ์ AppAttestSuccess และ AppAttestFailure อาจใช้เวลาถึง 24 ชั่วโมงเพื่อดูเหตุการณ์ในแดชบอร์ด หรือคุณสามารถเปิดใช้งานการแก้ไขข้อบกพร่องและใช้ DebugView เพื่อดูเหตุการณ์การแก้ไขข้อบกพร่องได้รวดเร็วยิ่งขึ้น

คุณสามารถตรวจสอบแดชบอร์ด Crashlytics เพื่อเพิ่มอัตราการหยุดทำงาน สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการเพิ่ม Crashlytics ในแอปของคุณ โปรดดูที่ การเริ่มต้นใช้งาน Firebase Crashlytics

เมื่อคุณเห็นเหตุการณ์ AppAttestSuccess เป็นส่วนใหญ่และเหตุการณ์ AppAttestFailure เพียงเล็กน้อย ก็เป็นสัญญาณที่ดีว่าคุณสามารถเพิ่มเปอร์เซ็นต์ของผู้ใช้ที่เปิดใช้งาน App Attest ได้โดยการแก้ไขเงื่อนไขในพารามิเตอร์ Remote Config AppAttestEnabled

ตรวจสอบเหตุการณ์ Analytics ในคอนโซล Firebase

ทางเลือก: ใช้ประโยชน์จากผู้ชม Google Analytics

หากคุณต้องการใช้ประโยชน์จากเหตุการณ์ AppAttestEnabled Analytics มากขึ้น คุณสามารถสร้าง Analytics Audience เพื่อติดตามผู้ใช้โดยตั้งค่า AppAttestEnabled เป็น True

App Attest เปิดตัวพร้อมกับ iOS 14.0 ผู้ใช้ของคุณบางรายอาจไม่ได้อยู่ในรุ่นนี้ จึงไม่มีสิทธิ์ได้รับ App Attest คุณสามารถบันทึกเหตุการณ์ Analytics อื่นเพื่อติดตามผู้ใช้เหล่านี้ จากนั้นกำหนดเป้าหมายผู้ชมนั้นสำหรับวิธีการรับรองอื่น เช่น DeviceCheck

ไม่บังคับ: ใช้ Crashlytics เพื่อตรวจสอบข้อขัดข้อง

เพื่อให้เข้าใจความเสถียรของแอประหว่างการเปิดตัวได้ดียิ่งขึ้น ให้ใช้ Firebase Crashlytics เพื่อตรวจสอบข้อขัดข้องและไม่ร้ายแรง

6. ยินดีด้วย!

คุณเปิดตัว App Check ด้วย Remote Config สำเร็จแล้ว 🎉

แหล่งข้อมูลเพิ่มเติม: