Dần dần triển khai Kiểm tra ứng dụng Firebase bằng Cấu hình từ xa Firebase

1. Giới thiệu

Bạn có thể sử dụng Kiểm tra ứng dụng Firebase bằng Chứng thực ứng dụng để bảo vệ các dịch vụ phụ trợ của mình và xác minh rằng các yêu cầu đối với dịch vụ Firebase đến từ ứng dụng xác thực của bạn.

Thông thường, người dùng nên dần dần sử dụng dịch vụ Chứng thực ứng dụng để tránh đạt đến giới hạn hạn mức. Để biết thêm thông tin, hãy xem tài liệu " Chuẩn bị sử dụng Dịch vụ chứng thực ứng dụng " của Apple.

Khả năng phát hành dần dần các bản cập nhật ứng dụng bằng tính năng App Store Connect của Apple, như được mô tả trong " Phát hành bản cập nhật phiên bản theo từng giai đoạn ", có thể giúp quá trình triển khai Kiểm tra ứng dụng suôn sẻ hơn. Đây là một giải pháp đơn giản, dễ hiểu. Tuy nhiên, việc phát hành bản cập nhật phiên bản ứng dụng theo từng giai đoạn không cho phép bạn kiểm soát việc triển khai hoặc thay đổi hành vi của các ứng dụng cập nhật, hiện có mà không xuất bản phiên bản ứng dụng mới.

Một cách để có nhiều quyền kiểm soát hơn đối với việc triển khai Kiểm tra ứng dụng bằng Chứng thực ứng dụng là sử dụng Cấu hình từ xa Firebase để bật Kiểm tra ứng dụng bằng Chứng thực ứng dụng cho một tỷ lệ phần trăm người dùng ứng dụng của bạn tại một thời điểm. Điều này có thể giúp tránh bị điều tiết từ máy chủ chứng thực. Google Analytics có thể được sử dụng để quan sát tác động của việc triển khai đối với người dùng.

Bạn sẽ học được gì

Trong lớp học lập trình gồm nhiều bước này, bạn sẽ tìm hiểu cách sử dụng Cấu hình từ xa Firebase để triển khai Kiểm tra ứng dụng cho ứng dụng của mình.

Lớp học lập trình này sử dụng dự án Firebase dựa trên ứng dụng khởi động nhanh DatabaseExample và được tích hợp với Kiểm tra ứng dụng Firebase, như được mô tả trong lớp học lập trình Kiểm tra ứng dụng Firebase cho Nền tảng Apple . Ứng dụng khởi động nhanh DatabaseExample cho phép người dùng đăng nhập và thêm bài đăng bằng các tính năng của Cơ sở dữ liệu thời gian thực Firebase.

Bạn cũng có thể điều chỉnh các bước trong lớp học lập trình này để thử nghiệm ứng dụng của riêng mình.

Điều kiện tiên quyết

Những gì bạn cần

  • Xcode 12.5+
  • Đối với thử nghiệm Chứng thực ứng dụng:
  • Dự án Firebase với:
  • Quyền truy cập vào dự án Firebase được liên kết trong ứng dụng của bạn, với quyền tạo và quản lý Cấu hình từ xa cũng như xem Google Analytics

2. Tạo nhà cung cấp chứng thực tùy chỉnh

Trong bước này, chúng tôi sẽ tạo một lớp nhà cung cấp tùy chỉnh để chỉ cung cấp mã thông báo khi Chứng thực ứng dụng được bật. Cấu hình từ xa dựa trên phiên bản ứng dụng Firebase đã định cấu hình và nhà cung cấp tùy chỉnh mà bạn triển khai trong bước này đóng vai trò là trình giữ chỗ để hoàn tất việc định cấu hình.

Để hoàn tất các bước sau, bạn cần thêm Firebase , FirebaseRemoteConfigFirebaseAnalytics trong phần Khung, Thư viện và Nội dung nhúng của ứng dụng trong Xcode. Để biết ví dụ về cách thực hiện việc này, hãy tham khảo phần kiểm tra ứng dụng Firebase dành cho lớp học lập trình nền tảng Apple .

  1. Tạo một tệp " MyAppCheckProvider " là một lớp con của NSObject tuân theo giao thức AppCheckProvider .
  2. Bao gồm một phương thức getToken() trống mà bạn sẽ điền sau.

Xem mã ví dụ sau cho lớp nhà cung cấp tùy chỉnh với phương thức getToken() trống.

// MyAppCheckProvider.swift

import Firebase
import FirebaseAnalytics
import FirebaseAppCheck
import FirebaseRemoteConfig

class MyAppCheckProvider: NSObject, AppCheckProvider {
  func getToken(completion handler: @escaping (AppCheckToken?, Error?) -> Void) {}
}

Để khởi tạo AppAttestProvider , bạn sẽ cần chuyển một phiên bản của FirebaseApp tương ứng. Tạo một thuộc tính được lưu trữ cho nó và chấp nhận nó làm tham số khởi tạo:

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

Chuyển tiếp yêu cầu mã thông báo tới nhà cung cấp Chứng thực ứng dụng

Bây giờ bạn có mọi thứ để chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp Chứng thực ứng dụng trong phương thức getToken() của mình.

Lưu ý: Tìm hiểu thêm về phương thức getToken() trong Tài liệu tham khảo khung FirebaseAppCheck .

Thêm mã sau vào phương thức getToken() của bạn:

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

Mã trước đó sẽ kiểm tra tham số boolean Remote Config AppAttestEnabled (tham số Remote Config này sẽ được tạo sau trong lớp học lập trình). Nếu giá trị sai thì mã không thành công, cho biết rằng Kiểm tra ứng dụng chưa được triển khai trên thiết bị hiện tại. Nếu giá trị là đúng, mã sẽ cố gắng lấy nhà cung cấp Chứng thực ứng dụng và không thành công nếu không thể. Nếu các bước kiểm tra lỗi này được thông qua, mã sẽ chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp Chứng thực ứng dụng.

Thêm sự kiện Analytics

Bằng cách thêm các sự kiện Analytics, bạn sẽ hiểu rõ hơn về mức độ thành công của quá trình triển khai Kiểm tra ứng dụng. Analytics sẽ giúp xác định xem có nên bật Chứng thực ứng dụng cho nhiều đối tượng hơn hay không.

Ghi lại hai sự kiện Analytics: AppAttestSuccess khi thành công và AppAttestFailure khi thất bại. Hai sự kiện Analytics này có thể giúp theo dõi sự thành công của quá trình triển khai Kiểm tra ứng dụng và giúp bạn quyết định xem có nên tiếp tục triển khai quy mô lớn hơn hay không.

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. Cập nhật lớp Nhà máy cung cấp

Sau khi triển khai logic để chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp Chứng thực ứng dụng và thêm một số sự kiện Analytics, bạn cần cập nhật MyAppCheckProviderFactory.class mà bạn đã tạo trong lớp học lập trình Kiểm tra ứng dụng cho Nền tảng Apple . Lớp này sẽ nhắm mục tiêu nhà cung cấp gỡ lỗi Kiểm tra ứng dụng cho trình mô phỏng và nếu không thì nhắm mục tiêu nhà cung cấp tùy chỉnh của bạn.

Chỉnh sửa mã sau đây trong lớp MyAppCheckProviderFactory mà bạn đã tạo trong lớp học lập trình Kiểm tra ứng dụng Firebase cho nền tảng 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
  }
}

Xác nhận bạn đã đặt AppCheckProviderFactory trước khi định cấu hình FirebaseApp :

// DatabaseExampleApp.swift

import SwiftUI
import Firebase
import FirebaseAppCheck

@main
struct DatabaseExampleApp: App {
  init() {
    AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
    FirebaseApp.configure()
  }

  // ...
}

4. Thêm tham số Cấu hình từ xa trong bảng điều khiển Firebase

Bây giờ bạn sẽ thêm tham số Cấu hình từ xa AppAttestEnabled vào bảng điều khiển Firebase. Phương thức getToken của bạn yêu cầu tham số này.

Để tạo tham số Cấu hình từ xa trong bảng điều khiển Firebase:

  1. Mở Cấu hình từ xa cho dự án của bạn và nhấp vào Thêm tham số . Nếu đây là lần đầu tiên bạn sử dụng Remote Config, hãy nhấp vào Create configure .
  2. Trong trường Tên (khóa) tham số, nhập AppAttestEnabled .
  3. Từ trình đơn thả xuống Loại dữ liệu , chọn Boolean .
  4. Từ danh sách thả xuống Giá trị mặc định , hãy chọn sai .

Tạo tham số cấu hình từ xa trong bảng điều khiển Firebase

Trước khi nhấp vào Lưu, hãy tạo giá trị có điều kiện cho 10% người dùng:

  1. Nhấp vào Thêm mới > Giá trị có điều kiện > Tạo điều kiện mới .
  2. Trong trường Tên , nhập tên điều kiện.
  3. Trong Áp dụng nếu... , chọn Người dùng trong phân vị ngẫu nhiên , <= , sau đó nhập 10 vào trường % .
  4. Nhấp vào Tạo điều kiện .

Xác định điều kiện Cấu hình từ xa trong bảng điều khiển Firebase

Đặt giá trị có điều kiện thành true để Chứng thực ứng dụng sẽ được triển khai cho 10% người dùng của bạn.

  1. Đặt giá trị thành true cho điều kiện bạn vừa tạo.
  2. Nhấp vào để lưu .

Xem lại tham số Cấu hình từ xa trong bảng điều khiển Firebase

Khi bạn hoàn tất, hãy xuất bản các thay đổi Cấu hình từ xa.

Kiểm tra việc triển khai trên thiết bị của bạn

Để kiểm tra các giá trị cờ Cấu hình từ xa khác nhau trên thiết bị của bạn mà không sửa đổi mã ứng dụng, hãy định cấu hình thử nghiệm trên thông số AppAttestEnabled theo hướng dẫn Tạo thử nghiệm cấu hình từ xa Firebase bằng thử nghiệm A/B . Phần hướng dẫn " Xác thực thử nghiệm của bạn trên thiết bị thử nghiệm " giải thích cách gán các giá trị khác nhau cho thiết bị thử nghiệm của bạn.

Bước cuối cùng là sử dụng Google Analytics để theo dõi sự thành công của quá trình triển khai Chứng thực ứng dụng của bạn.

5. Đánh giá sự thành công của quá trình triển khai AppCheck của bạn

Bạn có thể đo lường mức độ thành công của quá trình triển khai trên trang tổng quan Sự kiện Analytics. Theo dõi các sự kiện AppAttestSuccessAppAttestFailure . Có thể mất tới 24 giờ để xem các sự kiện trong trang tổng quan. Ngoài ra, bạn có thể bật gỡ lỗi và sử dụng DebugView để xem các sự kiện gỡ lỗi nhanh hơn.

Theo tùy chọn, bạn có thể theo dõi bảng điều khiển Crashlytics để biết tỷ lệ sự cố tăng lên. Để biết thêm thông tin về cách thêm Crashlytics vào ứng dụng của bạn, hãy xem Bắt đầu với Firebase Crashlytics .

Khi bạn thấy hầu hết các sự kiện AppAttestSuccess và một vài sự kiện AppAttestFailure , đó là một dấu hiệu tốt cho thấy bạn có thể tăng phần trăm người dùng đã bật App Attest bằng cách sửa đổi điều kiện trong tham số Cấu hình từ xa AppAttestEnabled .

Xem lại các sự kiện Analytics trong bảng điều khiển Firebase

Tùy chọn: Tận dụng đối tượng Google Analytics

Nếu muốn tận dụng hơn nữa sự kiện AppAttestEnabled Analytics, bạn có thể tạo Đối tượng Analytics để theo dõi người dùng với AppAttestEnabled được đặt thành true.

App Attest được phát hành cùng với iOS 14.0. Một số người dùng của bạn có thể không có trong bản phát hành này và do đó không đủ điều kiện để Chứng thực ứng dụng. Bạn có thể ghi lại một sự kiện Analytics khác để theo dõi những người dùng này, sau đó nhắm mục tiêu đối tượng đó cho một phương pháp chứng thực khác, chẳng hạn như DeviceCheck .

Tùy chọn: Sử dụng Crashlytics để theo dõi sự cố

Để hiểu rõ hơn về tính ổn định của ứng dụng trong quá trình triển khai, hãy sử dụng Firebase Crashlytics để theo dõi các sự cố và trường hợp không gây tử vong.

6. Xin chúc mừng!

Bạn đã triển khai thành công Kiểm tra ứng dụng bằng Cấu hình từ xa 🎉

Tài nguyên bổ sung: