ค่อยๆ เปิดตัว Firebase App Check โดยใช้การกำหนดค่าระยะไกลของ Firebase

1. บทนำ

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

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

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

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

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

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

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

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

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

สิ่งที่คุณต้องมี

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

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

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

ในการทำตามขั้นตอนต่อไปนี้ คุณจะต้องเพิ่ม Firebase, FirebaseRemoteConfig และ FirebaseAnalytics ในส่วนเฟรมเวิร์ก ไลบรารี และเนื้อหาที่ฝังของแอปใน Xcode โปรดดูตัวอย่างวิธีการใน Firebase App Check สำหรับ 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 ที่เกี่ยวข้อง สร้างพร็อพเพอร์ตี้ที่จัดเก็บไว้แล้วยอมรับเป็นพารามิเตอร์เริ่มต้นโดยทำดังนี้

// 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

เพิ่มโค้ดต่อไปนี้ลงในเมธอด 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 ของการกำหนดค่าระยะไกล (พารามิเตอร์การกำหนดค่าระยะไกลนี้จะสร้างขึ้นภายหลังใน Codelab) หากค่าเป็น "เท็จ" โค้ดจะใช้งานไม่ได้ ซึ่งแสดงว่าไม่มีการเปิดตัว App Check ในอุปกรณ์ปัจจุบัน หากค่าเป็นจริง โค้ดจะพยายามรับผู้ให้บริการ App Attest และล้มเหลวถ้าไม่สามารถ หากผ่านการตรวจสอบข้อผิดพลาดเหล่านี้ โค้ดจะส่งต่อคำขอโทเค็นไปยังผู้ให้บริการ App Attest

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

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

บันทึกเหตุการณ์ Analytics 2 รายการ ได้แก่ AppAttestSuccess เมื่อสำเร็จ และ AppAttestFailure เมื่อล้มเหลว เหตุการณ์ใน Analytics ทั้ง 2 รายการนี้จะช่วยติดตามความสำเร็จของการเปิดตัว 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. อัปเดตคลาสของผู้ให้บริการจากโรงงาน

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

แก้ไขโค้ดต่อไปนี้ในคลาส MyAppCheckProviderFactory ที่คุณสร้างไว้ใน Firebase App Check สำหรับ Codelab ของ 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 ต้องมีพารามิเตอร์นี้

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ไม่บังคับ: ใช้ประโยชน์จากกลุ่มเป้าหมายของ Google Analytics

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

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

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

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

6. ยินดีด้วย

คุณเปิดตัว App Check ด้วยการกำหนดค่าระยะไกลเรียบร้อยแล้ว 🎉

ทรัพยากรเพิ่มเติม: