به تدریج Firebase App Check را با استفاده از Firebase Remote Config اجرا کنید

1. مقدمه

می‌توانید از Firebase App Check با App Attest برای محافظت از خدمات باطن خود استفاده کنید و تأیید کنید که درخواست‌های خدمات Firebase از برنامه معتبر شما ارسال می‌شود.

به طور کلی توصیه می شود برای جلوگیری از رسیدن به محدودیت های سهمیه، کاربران را به تدریج به سرویس App Attest وارد کنید. برای اطلاعات بیشتر، به مستندات اپل " آماده سازی برای استفاده از سرویس گواهی برنامه " مراجعه کنید.

توانایی انتشار تدریجی به‌روزرسانی‌های برنامه با استفاده از ویژگی App Store App Apple's Connect، همانطور که در « انتشار به‌روزرسانی نسخه در مراحل » توضیح داده شده است، می‌تواند عرضه App Check را روان‌تر کند. این یک راه حل ساده و ساده است. با این حال، انتشار نسخه به‌روزرسانی نسخه برنامه به صورت مرحله‌ای به شما اجازه نمی‌دهد که عرضه یا تغییر رفتار برنامه‌های به‌روزرسانی‌شده موجود را بدون انتشار نسخه جدید برنامه کنترل کنید.

یکی از راه‌های کنترل بیشتر بر روی App Check with App Attest، استفاده از Firebase Remote Config برای فعال کردن App Check with App Attest برای درصدی از کاربران برنامه شما در یک زمان است. این ممکن است به جلوگیری از فشار از سرورهای گواهی کمک کند. گوگل آنالیتیکس می تواند برای مشاهده تاثیر انتشار بر روی کاربران استفاده شود.

چیزی که یاد خواهید گرفت

در این کد لبه چند مرحله ای، یاد خواهید گرفت که چگونه از Firebase Remote Config برای اجرای App Check برای برنامه خود استفاده کنید.

این کد لبه از یک پروژه Firebase مبتنی بر برنامه شروع سریع DatabaseExample و ادغام شده با Firebase App Check استفاده می‌کند، همانطور که در Firebase App Check for Apple Platforms Codelab توضیح داده شده است. برنامه DatabaseExample به کاربران اجازه می دهد تا با استفاده از ویژگی های پایگاه داده بیدرنگ Firebase وارد سیستم شوند و پست ها را اضافه کنند.

همچنین می‌توانید مراحل این کد لبه را برای آزمایش برنامه خود تطبیق دهید.

پیش نیازها

آنچه شما نیاز دارید

  • Xcode 12.5+
  • برای تست App Atest:
    • یک حساب توسعه دهنده اپل که به شما امکان می دهد شناسه های برنامه جدید ایجاد کنید
    • برنامه ای با شناسه برنامه صریح با قابلیت App Attest فعال است. اگر در این فرآیند به کمک نیاز دارید، به مقاله‌های ثبت شناسه برنامه و فعال کردن قابلیت‌های برنامه مراجعه کنید.
    • یک دستگاه iOS/iPadOS که از App Attest پشتیبانی می‌کند
  • پروژه Firebase با:
  • دسترسی به پروژه Firebase مرتبط با برنامه شما، با مجوزهای ایجاد و مدیریت Remote Config و مشاهده Google Analytics

2. یک ارائه دهنده گواهی سفارشی ایجاد کنید

در این مرحله، یک کلاس ارائه‌دهنده سفارشی ایجاد می‌کنیم تا تنها زمانی که App Attest فعال باشد، یک توکن ارائه می‌کند. Remote Config به یک نمونه برنامه Firebase پیکربندی شده متکی است و ارائه دهنده سفارشی که در این مرحله پیاده سازی می کنید به عنوان مکان نگهدار برای تکمیل پیکربندی عمل می کند.

برای تکمیل مراحل زیر، باید Firebase ، FirebaseRemoteConfig ، و FirebaseAnalytics در بخش Frameworks، Libraries و Embedded Content برنامه خود در Xcode اضافه کنید. برای مثالی از نحوه انجام این کار، به بررسی برنامه Firebase برای Apple platforms 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)
}

کد قبلی یک پارامتر بولی Remote Config AppAttestEnabled را بررسی می کند (این پارامتر Remote Config بعداً در Codelab ایجاد خواهد شد). اگر مقدار نادرست باشد، کد ناموفق است، که نشان می‌دهد App Check در دستگاه فعلی منتشر نشده است. اگر مقدار درست باشد، کد سعی می‌کند یک ارائه‌دهنده App Attest را به دست آورد و اگر نتواند انجام شود، با شکست مواجه می‌شود. اگر این بررسی‌های خطا تایید شود، کد درخواست توکن را به ارائه‌دهنده App Attest ارسال می‌کند.

رویدادهای Analytics را اضافه کنید

با افزودن رویدادهای Analytics، بینش بهتری در مورد میزان موفقیت عرضه بررسی برنامه دریافت می‌کنید. تجزیه و تحلیل کمک می کند تا مشخص شود که آیا 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 را که در App Check for Apple Platforms Codelab ایجاد کرده‌اید، به‌روزرسانی کنید. این کلاس ارائه‌دهنده اشکال‌زدایی App Check را برای شبیه‌سازها هدف قرار می‌دهد و در غیر این صورت ارائه‌دهنده سفارشی شما را هدف قرار می‌دهد.

کد زیر را در کلاس MyAppCheckProviderFactory که در Firebase App Check for 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
  }
}

قبل از پیکربندی FirebaseApp ، تأیید کنید که AppCheckProviderFactory را تنظیم کرده اید:

// 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. Remote Config را برای پروژه خود باز کنید و روی افزودن پارامتر کلیک کنید. اگر اولین باری است که از Remote Config استفاده می‌کنید، روی ایجاد پیکربندی کلیک کنید.
  2. در قسمت نام پارامتر (کلید) ، AppAttestEnabled وارد کنید.
  3. از منوی کشویی Data type ، Boolean را انتخاب کنید.
  4. از منوی کشویی مقدار پیش فرض ، false را انتخاب کنید.

ایجاد پارامتر Remote Config در کنسول Firebase

قبل از کلیک بر روی ذخیره، یک مقدار شرطی برای 10٪ از کاربران ایجاد کنید:

  1. روی افزودن جدید > مقدار شرطی > ایجاد شرط جدید کلیک کنید.
  2. در قسمت Name یک نام شرط وارد کنید.
  3. در قسمت Applies if... ، User in random صدک <= را انتخاب کنید و سپس عدد 10 را در فیلد % وارد کنید.
  4. روی ایجاد شرط کلیک کنید.

تعریف یک شرط Remote Config در کنسول Firebase

مقدار شرطی را روی true تنظیم کنید تا App Attest برای 10٪ از کاربران شما عرضه شود.

  1. برای شرایطی که ایجاد کردید مقدار true را تنظیم کنید.
  2. روی ذخیره کلیک کنید.

بررسی پارامتر Remote Config در کنسول Firebase

وقتی کارتان تمام شد، تغییرات Remote Config را منتشر کنید.

عرضه را در دستگاه خود آزمایش کنید

برای آزمایش مقادیر مختلف پرچم Remote Config در دستگاه خود بدون تغییر کد برنامه، آزمایشی را روی پارامتر AppAttestEnabled به دنبال آموزش ایجاد آزمایش‌های پیکربندی از راه دور Firebase با آزمایش A/B پیکربندی کنید. بخش آموزشی " تأیید آزمایش خود در یک دستگاه آزمایشی " نحوه اختصاص مقادیر مختلف برای دستگاه آزمایشی را توضیح می دهد.

مرحله آخر استفاده از Google Analytics برای نظارت بر موفقیت انتشار App Attest است.

5. موفقیت انتشار AppCheck خود را مرور کنید

می‌توانید موفقیت عرضه خود را در داشبورد رویدادهای Analytics اندازه‌گیری کنید. رویدادهای AppAttestSuccess و AppAttestFailure را تماشا کنید. دیدن رویدادها در داشبورد ممکن است تا 24 ساعت طول بکشد. از طرف دیگر، می‌توانید اشکال‌زدایی را فعال کنید و از DebugView برای مشاهده سریع‌تر رویدادهای اشکال‌زدایی استفاده کنید.

به صورت اختیاری، می‌توانید داشبورد Crashlytics را برای افزایش نرخ خرابی کنترل کنید. برای اطلاعات بیشتر درباره افزودن Crashlytics به برنامه خود، به شروع با Firebase Crashlytics مراجعه کنید.

هنگامی که بیشتر رویدادهای AppAttestSuccess و چند رویداد AppAttestFailure را مشاهده کردید، نشانه خوبی است که می‌توانید با تغییر شرط در پارامتر Remote Config AppAttestEnabled، درصد کاربرانی را که App Attest فعال کرده‌اند، افزایش دهید.

بررسی رویدادهای Analytics در کنسول Firebase

اختیاری: از مخاطبان Google Analytics استفاده کنید

اگر می‌خواهید از رویداد AppAttestEnabled Analytics بیشتر استفاده کنید، می‌توانید یک Analytics Audience برای ردیابی کاربران با AppAttestEnabled ایجاد کنید.

App Attest با iOS 14.0 منتشر شد. ممکن است برخی از کاربران شما در این نسخه نباشند، و بنابراین واجد شرایط App Atest نیستند. می‌توانید رویداد Analytics دیگری را برای ردیابی این کاربران ثبت کنید، سپس آن مخاطبان را برای روش تأیید دیگری، مانند DeviceCheck ، هدف قرار دهید.

اختیاری: از Crashlytics برای نظارت بر خرابی ها استفاده کنید

برای درک بهتر پایداری برنامه خود در طول عرضه، از Firebase Crashlytics برای نظارت بر خرابی‌ها و موارد غیرمرگبار استفاده کنید.

6. تبریک!

شما با موفقیت برنامه بررسی را با پیکربندی از راه دور منتشر کردید 🎉

منابع اضافی: