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

1. บทนำ

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

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

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

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

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

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

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

นอกจากนี้ คุณยังปรับขั้นตอนในโค้ดแล็บนี้เพื่อทดสอบแอปของคุณเองได้ด้วย

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

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

  • Xcode 12.5 ขึ้นไป
  • สำหรับการทดสอบ App Attest
    • บัญชีนักพัฒนาแอปของ Apple ที่อนุญาตให้คุณสร้างตัวระบุแอปใหม่
    • แอปพลิเคชันที่มีรหัสแอปที่ชัดเจนซึ่งเปิดใช้ความสามารถในการยืนยันแอปแล้ว ดูบทความลงทะเบียนรหัสแอปและเปิดใช้ความสามารถของแอปหากต้องการความช่วยเหลือเกี่ยวกับกระบวนการนี้
    • อุปกรณ์ 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. อัปเดตคลาส Provider Factory

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

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

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

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

ก่อนคลิกบันทึก ให้สร้างค่าแบบมีเงื่อนไขสำหรับผู้ใช้ 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 ได้โดยการแก้ไขเงื่อนไขในพารามิเตอร์ Remote Config AppAttestEnabled

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

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

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

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

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

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

6. ยินดีด้วย

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

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