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

۱. مقدمه

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

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

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

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

آنچه یاد خواهید گرفت

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

این آزمایشگاه کد از یک پروژه Firebase مبتنی بر برنامه شروع سریع DatabaseExample استفاده می‌کند و با Firebase App Check ادغام شده است، همانطور که در آزمایشگاه کد Firebase App Check برای پلتفرم‌های اپل توضیح داده شده است. برنامه شروع سریع DatabaseExample به کاربران امکان می‌دهد تا با استفاده از ویژگی‌های Firebase Realtime Database وارد سیستم شوند و پست اضافه کنند.

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

پیش‌نیازها

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

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

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

برای تکمیل مراحل زیر، باید Firebase ، FirebaseRemoteConfig و FirebaseAnalytics را در بخش Frameworks، Libraries و Embedded Content برنامه خود در Xcode اضافه کنید. برای مثالی از نحوه انجام این کار، به بررسی برنامه Firebase برای پلتفرم‌های اپل در 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 ایجاد خواهد شد). اگر مقدار آن false باشد، کد با شکست مواجه می‌شود و نشان می‌دهد که App Check روی دستگاه فعلی اجرا نشده است. اگر مقدار آن true باشد، کد سعی می‌کند یک ارائه‌دهنده App Attest را دریافت کند و اگر نتواند، با شکست مواجه می‌شود. اگر این بررسی‌های خطا با موفقیت انجام شوند، کد درخواست توکن را به ارائه‌دهنده App Attest ارسال می‌کند.

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

با افزودن رویدادهای Analytics، بینش بهتری در مورد میزان موفقیت راه‌اندازی App Check به دست خواهید آورد. Analytics به تعیین اینکه آیا App Attest باید برای مخاطبان بیشتری فعال شود یا خیر، کمک خواهد کرد.

دو رویداد تحلیلی را ثبت کنید: AppAttestSuccess در صورت موفقیت، و AppAttestFailure در صورت شکست. این دو رویداد تحلیلی می‌توانند به پیگیری موفقیت انتشار 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)
    }
  }
}

۳. کلاس Provider Factory را به‌روزرسانی کنید

پس از اینکه منطق ارسال درخواست توکن به ارائه‌دهنده App Attest را پیاده‌سازی کردید و برخی رویدادهای Analytics را اضافه کردید، باید MyAppCheckProviderFactory.class را که در Codelab مربوط به App Check برای پلتفرم‌های اپل ایجاد کرده‌اید، به‌روزرسانی کنید. این کلاس ، ارائه‌دهنده اشکال‌زدایی App Check را برای شبیه‌سازها و در غیر این صورت ارائه‌دهنده سفارشی شما را هدف قرار می‌دهد.

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

  // ...
}

۴. یک پارامتر Remote Config در کنسول Firebase اضافه کنید

اکنون پارامتر Remote Config به نام AppAttestEnabled را به کنسول Firebase اضافه خواهید کرد. متد getToken شما به این پارامتر نیاز دارد.

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

  1. Remote Config را برای پروژه خود باز کنید و روی Add parameter کلیک کنید. اگر این اولین بار است که از Remote Config استفاده می‌کنید، روی Create configuration کلیک کنید.
  2. در فیلد Parameter name (key) ، AppAttestEnabled وارد کنید.
  3. از منوی کشویی نوع داده (Data typeنوع داده بولی (Boolean) را انتخاب کنید.
  4. از منوی کشویی مقدار پیش‌فرض ، مقدار false را انتخاب کنید.

ایجاد پارامتر پیکربندی از راه دور در کنسول Firebase

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

  1. روی افزودن جدید > مقدار شرطی > ایجاد شرط جدید کلیک کنید.
  2. در قسمت نام ، نام شرط را وارد کنید.
  3. در قسمت «اعمال می‌شود اگر...» ، گزینه «کاربر در صدک تصادفی» ، <= را انتخاب کنید و سپس عدد ۱۰ را در فیلد % وارد کنید.
  4. روی ایجاد شرط کلیک کنید.

تعریف یک وضعیت پیکربندی از راه دور در کنسول Firebase

مقدار شرطی را روی درست تنظیم کنید تا App Attest برای 10٪ از کاربران شما فعال شود.

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

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

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

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

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

مرحله آخر، استفاده از گوگل آنالیتیکس برای نظارت بر موفقیت فرآیند App Attest است.

۵. موفقیت انتشار AppCheck خود را بررسی کنید

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

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

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

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

اختیاری: از مخاطبان گوگل آنالیتیکس استفاده کنید

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

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

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

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

۶. تبریک می‌گویم!

شما با موفقیت App Check را با Remote Config 🎉 راه‌اندازی کردید.

منابع اضافی: