Dần dần triển khai Kiểm tra ứng dụng Firebase bằng cách sử dụ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 với 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 chuyển sang sử dụng dịch vụ Chứng thực ứng dụng để tránh đạt đến giới hạn hạn ngạch. Để 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 từng bước các bản cập nhật ứng dụng bằng cách sử dụ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 mượt mà 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 hiện có, được cập nhật 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 chỉ ứng dụng là sử dụng Cấu hình từ xa của Firebase để bật Kiểm tra ứng dụng bằng Chứng chỉ ứng dụng cho một 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 điều tiết từ các 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.

Những gì bạn sẽ học

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

Bảng mã 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 bảng mã Kiểm tra ứng dụng Firebase dành 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 của Firebase.

Bạn cũng có thể điều chỉnh các bước trong bảng mã này để kiểm tra ứ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:
    • Tài khoản nhà phát triển Apple cho phép bạn tạo số nhận dạng ứng dụng mới
    • Ứng dụng có ID ứng dụng rõ ràng đã bật tính năng Chứng thực ứng dụng. Xem bài viết Đăng ký ID ứng dụngBật khả năng ứng dụng nếu bạn cần trợ giúp về quy trình này.
    • Thiết bị iOS / iPadOS hỗ trợ App Attest
  • Dự án Firebase với:
  • Quyền truy cập vào dự án Firebase được liên kết với ứng dụng của bạn, có 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 nhận ứ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 cấu hình.

Để hoàn thành các bước sau, bạn cần thêm Firebase , FirebaseRemoteConfigFirebaseAnalytics vào 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 codelab nền tảng Apple .

  1. Tạo tệp " MyAppCheckProvider " là 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 vào 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 đến 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 bạn.

Lưu ý: Tìm hiểu thêm về phương thức getToken() trong Tham chiếu 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)
}

Đoạn mã trước đó sẽ kiểm tra tham số boolean của Remote Config AppAttestEnabled (tham số Remote Config này sẽ được tạo sau này trong codelab). Nếu giá trị sai, 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à true, 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 lần kiểm tra lỗi này được vượt 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 việc triển khai Kiểm tra ứng dụng. Phân tích 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 nhật ký 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 việc phát hành Kiểm tra ứng dụng của bạn và giúp bạn quyết định xem có nên tiếp tục phát hành 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 bạn đã 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 mã nguồn 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à nhắm mục tiêu nhà cung cấp tùy chỉnh của bạn.

Chỉnh sửa mã sau trong lớp MyAppCheckProviderFactory mà bạn đã tạo trong bảng mã chương 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 thông số Cấu hình từ xa trong bảng điều khiển Firebase

Bây giờ bạn sẽ thêm thông 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 thông 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 Cấu hình từ xa, hãy nhấp vào Tạo cấu hình .
  2. Trong trường Tên tham số (khóa) , nhập AppAttestEnabled .
  3. Từ menu Loại dữ liệu thả xuống, hãy chọn Boolean .
  4. Từ menu thả xuống Giá trị mặc định , hãy chọn sai .

Tạo thông 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 , hãy nhập tên điều kiện.
  3. Trong Áp dụng nếu ... , hãy chọn Người dùng trong phân vị ngẫu nhiên , <= , rồi 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 để App Attest sẽ 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 thông 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 phát hành 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 cần sửa đổi mã ứng dụng, hãy định cấu hình thử nghiệm trên thông số AppAttestEnabled sau hướng dẫn Tạo Thử nghiệm cấu hình từ xa Firebase với 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 chỉ định 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 việc phát hành Chứng thực ứng dụng của bạn.

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

Bạn có thể đo lường mức độ thành công của việc 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 đến 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 trang tổng quan 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 số sự kiện AppAttestFailure , đó là một dấu hiệu tốt cho thấy bạn có thể tăng tỷ lệ phần trăm người dùng đã bật App Attest bằng cách sửa đổi điều kiện trong thông số Cấu hình từ xa AppAttestEnabled .

Xem xét 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 bạn muốn tận dụng thêm 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 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 cho Chứng nhận ứng dụng. Bạn có thể ghi nhật ký 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ề độ ổ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à lỗi 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 với Cấu hình từ xa 🎉

Các nguồn bổ sung: