قم بطرح Firebase App Check تدريجيًا باستخدام Firebase Remote Config

1 المقدمة

يمكنك استخدام Firebase App Check مع App Attest لحماية خدمات الواجهة الخلفية لديك والتحقق من أن طلبات خدمات Firebase تأتي من تطبيقك الأصلي.

يوصى عمومًا بإلحاق المستخدمين تدريجيًا بخدمة App Attest لتجنب تجاوز حدود الحصص. لمزيد من المعلومات، راجع وثائق Apple " التحضير لاستخدام خدمة App Attest Service ".

إن القدرة على إصدار تحديثات التطبيق بشكل تدريجي باستخدام ميزة App Store Connect من Apple، كما هو موضح في " إصدار تحديث الإصدار على مراحل "، يمكن أن تجعل عملية التحقق من التطبيق أكثر سلاسة. هذا حل واضح وبسيط. ومع ذلك، فإن إصدار تحديث إصدار التطبيق على مراحل لا يسمح لك بالتحكم في طرح التطبيقات المحدثة الحالية أو تغيير سلوكها دون نشر إصدار تطبيق جديد.

تتمثل إحدى الطرق للحصول على مزيد من التحكم في عملية التحقق من التطبيق باستخدام App Attest في استخدام Firebase Remote Config لتمكين التحقق من التطبيق باستخدام App Attest لنسبة مئوية من مستخدمي تطبيقك في المرة الواحدة. قد يساعد هذا في تجنب التقييد من خوادم التصديق. يمكن استخدام Google Analytics لمراقبة تأثير الطرح على المستخدمين.

ما ستتعلمه

في هذا الدرس التطبيقي متعدد الخطوات حول التعليمات البرمجية، ستتعلم كيفية استخدام Firebase Remote Config لطرح App Check لتطبيقك.

يستخدم هذا الدرس التدريبي حول التعليمات البرمجية مشروع Firebase استنادًا إلى تطبيق DatabaseExample Quickstart ومتكامل مع Firebase App Check، كما هو موضح في التدريب على التعليمات البرمجية لـ Firebase App Check for Apple Platforms . يتيح تطبيق DatabaseExample Quickstart للمستخدمين تسجيل الدخول وإضافة منشورات باستخدام ميزات Firebase Realtime Database.

يمكنك أيضًا تعديل الخطوات الواردة في هذا الدرس التطبيقي حول التعليمات البرمجية لاختبار تطبيقك الخاص.

المتطلبات الأساسية

ماذا ستحتاج

2. قم بإنشاء مزود تصديق مخصص

في هذه الخطوة، سنقوم بإنشاء فئة موفر مخصصة لتوفير رمز مميز فقط عند تمكين App Attest. يعتمد التكوين عن بعد على مثيل تطبيق Firebase الذي تم تكوينه، ويعمل الموفر المخصص الذي تقوم بتنفيذه في هذه الخطوة كعنصر نائب لإنهاء التكوين.

لإكمال الخطوات التالية، ستحتاج إلى إضافة Firebase و FirebaseRemoteConfig و FirebaseAnalytics في قسم الإطارات والمكتبات والمحتوى المضمن في تطبيقك في Xcode. للحصول على مثال حول كيفية القيام بذلك، راجع فحص تطبيق Firebase للدرس التطبيقي حول التعليمات البرمجية لأنظمة 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)
}

يتحقق الكود السابق من المعلمة المنطقية Remote Config AppAttestEnabled (سيتم إنشاء معلمة Remote Config هذه لاحقًا في التعليمات البرمجية التطبيقية). إذا كانت القيمة خاطئة، فسيفشل الرمز، مما يشير إلى أنه لم يتم نشر التحقق من التطبيق على الجهاز الحالي. إذا كانت القيمة صحيحة، فسيحاول الرمز الحصول على موفر App Attest ويفشل إذا لم يتمكن من ذلك. إذا تم اجتياز عمليات التحقق من الأخطاء هذه، فسيقوم الرمز بإعادة توجيه طلب الرمز المميز إلى موفر App Attest.

أضف أحداث التحليلات

من خلال إضافة أحداث Analytics، يمكنك الحصول على رؤى أفضل حول مدى نجاح بدء تشغيل التحقق من التطبيق. ستساعد التحليلات في تحديد ما إذا كان يجب تمكين App Attest لجمهور أكبر.

قم بتسجيل حدثين في Analytics: AppAttestSuccess عند النجاح، و AppAttestFailure عند الفشل. يمكن أن يساعد حدثا Analytics هذين في تتبع نجاح عملية طرح التحقق من التطبيق ومساعدتك في تحديد ما إذا كان ينبغي متابعة عملية طرح أكبر أم لا.

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 الذي قمت بإنشائه في التطبيق التعليمات البرمجية الخاص بالتحقق من أنظمة Apple الأساسية . ستستهدف هذه الفئة موفر تصحيح أخطاء App Check لأجهزة المحاكاة، وستستهدف بخلاف ذلك الموفر المخصص الخاص بك.

قم بتحرير التعليمة البرمجية التالية في فئة MyAppCheckProviderFactory التي قمت بإنشائها في Firebase App Check for 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. افتح "التكوين عن بعد" لمشروعك وانقر فوق "إضافة معلمة" . إذا كانت هذه هي المرة الأولى التي تستخدم فيها Remote Config، فانقر فوق Create Configuration .
  2. في حقل اسم المعلمة (المفتاح) ، أدخل AppAttestEnabled .
  3. من القائمة المنسدلة نوع البيانات ، حدد منطقية .
  4. من القائمة المنسدلة القيمة الافتراضية ، حدد false .

إنشاء معلمة التكوين عن بعد في وحدة تحكم 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 Audience لتتبع المستخدمين مع تعيين AppAttestEnabled على true.

تم إصدار App Attest مع iOS 14.0. قد لا يكون بعض المستخدمين موجودين في هذا الإصدار، وبالتالي ليسوا مؤهلين للحصول على App Attest. يمكنك تسجيل حدث Analytics آخر لتتبع هؤلاء المستخدمين، ثم استهداف هذا الجمهور بطريقة مصادقة أخرى، مثل DeviceCheck .

اختياري: استخدم Crashlytics لمراقبة الأعطال

لفهم استقرار تطبيقك بشكل أفضل أثناء الطرح، استخدم Firebase Crashlytics لمراقبة الأعطال والحالات غير المميتة.

6. تهانينا!

لقد نجحت في طرح App Check with Remote Config 🎉

مصادر إضافية: