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

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

1. บทนำ

คุณสามารถใช้ Firebase App Check with 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 เพื่อเปิดตัว App Check สำหรับแอปของคุณ

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

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

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

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

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

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

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

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

  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)
}

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

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

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

บันทึกเหตุการณ์ Analytics สองเหตุการณ์: AppAttestSuccess on Success และ 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 ซึ่งคุณสร้างใน App Check สำหรับ Codelab ของแพลตฟอร์ม Apple คลาสนี้จะกำหนดเป้าหมาย ผู้ให้บริการดีบัก App Check สำหรับโปรแกรมจำลอง มิฉะนั้นจะกำหนดเป้าหมายผู้ให้บริการที่คุณกำหนดเอง

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

// 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. เพิ่มพารามิเตอร์ Remote Config ในคอนโซล Firebase

ตอนนี้คุณจะเพิ่มพารามิเตอร์ Remote Config AppAttestEnabled ให้กับคอนโซล Firebase เมธอด getToken ของคุณต้องการพารามิเตอร์นี้

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

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

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

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

  1. คลิก เพิ่มใหม่ > ค่าตามเงื่อนไข > สร้างเงื่อนไขใหม่
  2. ในฟิลด์ ชื่อ ให้ป้อนชื่อเงื่อนไข
  3. ภายใต้ Apply if... ให้เลือก User in random percentile , <= แล้วป้อน 10 ในฟิลด์ %
  4. คลิก สร้างเงื่อนไข

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

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

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

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

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

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

หากต้องการทดสอบค่าสถานะ Remote Config ต่างๆ ในอุปกรณ์ของคุณโดยไม่ต้องแก้ไขโค้ดของแอป ให้กำหนดค่าการทดสอบในพารามิเตอร์ AppAttestEnabled ตามบทแนะนำ Create Firebase Remote Config Experiments พร้อมบทแนะนำการทดสอบ 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

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

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

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

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

6. ขอแสดงความยินดี!

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

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