1. Giới thiệu
Bạn có thể sử dụng tính năng Kiểm tra ứng dụng Firebase với App Attest để bảo vệ các dịch vụ phụ trợ và xác minh rằng các yêu cầu đối với dịch vụ Firebase đến từ ứng dụng chính hãng của bạn.
Bạn nên dần dần giới thiệu cho người dùng về dịch vụ Chứng thực ứng dụng để tránh vượt quá 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 bản cập nhật ứng dụng theo từng giai đoạn bằng tính năng App Store Connect của Apple (như mô tả trong phần "Phát hành bản cập nhật theo từng giai đoạn") có thể giúp quá trình phát hành App Check diễn ra suôn sẻ hơn. Đây là một giải pháp đơn giản và dễ thực hiện. Tuy nhiên, việc phát hành bản cập nhật phiên bản ứng dụng theo giai đoạn không cho phép bạn kiểm soát quá trình 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 cần phát hành phiên bản ứng dụng mới.
Một cách để kiểm soát tốt hơn tính năng App Check khi triển khai App Attest là sử dụng Cấu hình từ xa Firebase để bật App Check bằng App Attest 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ị các máy chủ chứng thực điều tiết. Bạn có thể sử dụng Google Analytics để theo dõi tác động của quá trình phát hành đối với người dùng.
Kiến thức bạn sẽ học được
Trong lớp học lập trình nhiều bước này, bạn sẽ tìm hiểu cách sử dụng Firebase Remote Config để triển khai App Check cho ứng dụng của mình.
Lớp học lập trình này sử dụng một dự án Firebase dựa trên ứng dụng khởi động nhanh DatabaseExample và được tích hợp với tính năng Kiểm tra ứng dụng của Firebase, như mô tả trong lớp học lập trình Kiểm tra ứng dụng của Firebase cho các nền tảng của 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 theo thời gian thực của 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 để kiểm thử ứng dụng của riêng mình.
Điều kiện tiên quyết
Bạn cần
- Xcode 12.5 trở lên
- Đối với kiểm thử App Attest:
- Tài khoản Apple Developer cho phép bạn tạo mã nhận dạng ứng dụng mới
- Một ứng dụng có Mã ứng dụng rõ ràng và đã bật tính năng Chứng thực ứng dụng. Hãy xem bài viết Đăng ký mã ứng dụng và Bật các chức năng của ứng dụng nếu bạn cần trợ giúp về quy trình này.
- Một thiết bị iOS/iPadOS có hỗ trợ App Attest
- Dự án Firebase có:
- Một ứng dụng iOS đã được định cấu hình (tìm hiểu thêm)
- Google Analytics, Cấu hình từ xa và App Check được bật
- Có quyền truy cập vào dự án Firebase được liên kết của ứng dụng, có quyền tạo và quản lý Cấu hình từ xa, cũng như quyền xem Google Analytics
2. Tạo trình chứng thực tuỳ chỉnh
Trong bước này, chúng ta sẽ tạo một lớp trình cung cấp tuỳ chỉnh để chỉ cung cấp mã thông báo khi App Attest được bật. Cấu hình từ xa dựa vào một phiên bản ứng dụng Firebase đã định cấu hình và trình cung cấp tuỳ chỉnh mà bạn triển khai trong bước này sẽ đóng vai trò là phần giữ chỗ để hoàn tất cấu hình.
Để hoàn tất các bước sau, bạn cần thêm Firebase
, FirebaseRemoteConfig
và FirebaseAnalytics
vào phần Frameworks, Libraries, and Embedded Content (Khung, Thư viện và Nội dung được 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 Lớp học lập trình Kiểm tra ứng dụng Firebase cho các nền tảng của Apple.
- Tạo tệp "MyAppCheckProvider" là một lớp con của
NSObject
tuân theo giao thứcAppCheckProvider
. - Thêm một phương thức
getToken()
trống mà bạn sẽ điền thông tin sau.
Hãy xem đoạn mã ví dụ sau đây về lớp trình cung cấp tuỳ chỉnh có 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) {}
}
Để tạo bản sao AppAttestProvider
, bạn cần truyền một bản sao của FirebaseApp
tương ứng. Tạo một thuộc tính được lưu trữ cho đối tượng đó và chấp nhận đối tượng đó 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
Giờ đây, 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()
.
Lưu ý: Tìm hiểu thêm về phương thức getToken()
trong Tài liệu tham khảo về 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 đó kiểm tra một tham số boolean AppAttestEnabled
của Cấu hình từ xa (tham số Cấu hình từ xa này sẽ được tạo sau trong lớp học lập trình). Nếu giá trị là false, mã sẽ không thành công, cho biết rằng App Check 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 một trình cung cấp Chứng thực ứng dụng và sẽ không thành công nếu không lấy được. Nếu vượt qua các quy trình kiểm tra lỗi này, mã sẽ chuyển tiếp yêu cầu mã thông báo đến trình cung cấp Chứng thực thiết bị.
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 App Check. Analytics sẽ giúp xác định xem bạn có nên bật App Attest cho nhiều người dùng hơn hay không.
Ghi lại 2 sự kiện Analytics: AppAttestSuccess khi thành công và AppAttestFailure khi không thành công. Hai sự kiện Analytics này có thể giúp theo dõi mức độ thành công của quá trình triển khai App Check và giúp bạn quyết định xem có nên triển khai trên 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 Provider Factory
Sau khi triển khai logic chuyển tiếp yêu cầu mã thông báo đến nhà cung cấp App Attest 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 App Check cho các nền tảng của Apple. Lớp này sẽ nhắm đến trình cung cấp gỡ lỗi App Check cho trình mô phỏng, nếu không thì sẽ nhắm đến trình cung cấp tuỳ 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 Firebase App Check cho các nền tảng của 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 rằng 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 một thông số Remote Config trong bảng điều khiển của Firebase
Giờ đây, 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.
Cách tạo một thông số Remote Config trong bảng điều khiển của Firebase :
- Mở Cấu hình từ xa cho dự án của bạn rồi 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 Tạo cấu hình.
- Trong trường Tên thông số (khoá), hãy nhập
AppAttestEnabled
. - Trong trình đơn thả xuống Loại dữ liệu, hãy chọn Boolean.
- Trong trình đơn thả xuống Giá trị mặc định, hãy chọn false.
Trước khi nhấp vào Lưu, hãy tạo một giá trị có điều kiện cho 10% người dùng:
- Nhấp vào Thêm mới > Giá trị có điều kiện > Tạo điều kiện mới.
- Trong trường Name (Tên), hãy nhập tên điều kiện.
- Trong phần Áp dụng nếu..., hãy chọn Người dùng ở phân vị ngẫu nhiên, <=, rồi nhập 10 vào trường %.
- Nhấp vào Tạo điều kiện.
Đặ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.
- Đặt giá trị thành true cho điều kiện bạn vừa tạo.
- Nhấp vào Lưu.
Khi bạn hoàn tất, hãy xuất bản các thay đổi về Cấu hình từ xa.
Kiểm thử việc phát hành trên thiết bị của bạn
Để kiểm thử các giá trị cờ Cấu hình từ xa khác nhau trên thiết bị mà không cần sửa đổi mã ứng dụng, hãy định cấu hình một thử nghiệm trên tham số AppAttestEnabled theo hướng dẫn Tạo thử nghiệm Cấu hình từ xa Firebase thông qua tính năng Thử nghiệm A/B. Phần hướng dẫn "Xác thực thử nghiệm trên thiết bị kiểm thử" giải thích cách chỉ định các giá trị khác nhau cho thiết bị kiểm thử.
Bước cuối cùng là sử dụng Google Analytics để theo dõi mức độ thành công của quá trình triển khai App Attest.
5. Xem xét mức độ thành công của việc triển khai AppCheck
Bạn có thể đo lường mức độ thành công của quá trình phát hành trên trang tổng quan Sự kiện Analytics. Theo dõi các sự kiện AppAttestSuccess và AppAttestFailure. Có thể mất đến 24 giờ để sự kiện xuất hiện trên trang tổng quan. Ngoài ra, bạn có thể bật tính năng gỡ lỗi và sử dụng DebugView để xem các sự kiện gỡ lỗi nhanh hơn.
Bạn có thể theo dõi trang tổng quan Crashlytics để biết liệu tỷ lệ gặp sự cố có tăng lên hay không. Để biết thêm thông tin về cách thêm Crashlytics vào ứng dụng, hãy xem bài viết Bắt đầu sử dụng Firebase Crashlytics.
Khi bạn thấy hầu hết là sự kiện AppAttestSuccess và một vài sự kiện AppAttestFailure, thì đó là dấu hiệu cho thấy bạn có thể tăng tỷ lệ 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.
Không bắt buộc: Khai thác Đối tượng Google Analytics
Nếu muốn khai thác thêm sự kiện Analytics AppAttestEnabled, bạn có thể tạo một Đối tượng Analytics để theo dõi những người dùng có 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 sử dụng bản phát hành này, do đó không đủ điều kiện sử dụng Dịch vụ chứng thực ứng dụng. Bạn có thể ghi nhật ký một sự kiện Analytics khác để theo dõi những người dùng này, sau đó nhắm đến đối tượng đó bằng một phương thức chứng thực khác, chẳng hạn như DeviceCheck.
Không bắt buộc: 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 phát hành, hãy sử dụng Firebase Crashlytics để theo dõi sự cố và lỗi không nghiêm trọng.
6. Xin chúc mừng!
Bạn đã triển khai thành công App Check bằng Remote Config 🎉