1. מבוא
אתם יכולים להשתמש ב-Firebase App Check עם App Attest כדי להגן על שירותי ה-Backend שלכם ולוודא שהבקשות לשירותי Firebase מגיעות מהאפליקציה המקורית שלכם.
מומלץ בדרך כלל לצרף משתמשים לשירות App Attest בהדרגה כדי לא לחרוג ממגבלות המכסה. מידע נוסף זמין במסמכי התיעוד של Apple בנושא הכנה לשימוש בשירות App Attest.
האפשרות להשיק עדכונים לאפליקציה בהדרגה באמצעות התכונה App Store Connect של אפל, כפי שמתואר במאמר בנושא השקת עדכון גרסה בשלבים, יכולה להפוך את ההשקה של App Check לחלקה יותר. זהו פתרון פשוט וישיר. עם זאת, פרסום עדכון של גרסת אפליקציה בשלבים לא מאפשר לכם לשלוט בהשקה או לשנות את ההתנהגות של אפליקציות קיימות ומעודכנות בלי לפרסם גרסה חדשה של האפליקציה.
דרך אחת לקבל יותר שליטה על App Check באמצעות השקת App Attest היא להשתמש בהגדרת תצורה מרחוק ב-Firebase כדי להפעיל את App Check עם App Attest עבור אחוז מסוים של משתמשי האפליקציה בכל פעם. כך אפשר להימנע מהגבלת קצב העברת הנתונים מצד שרתי האימות. אפשר להשתמש ב-Google Analytics כדי לבחון את ההשפעה של ההשקה על המשתמשים.
מה תלמדו
ב-codelab הזה, שמורכב מכמה שלבים, תלמדו איך להשתמש בהגדרת תצורה מרחוק ב-Firebase כדי להשיק את App Check באפליקציה שלכם.
ב-codelab הזה נעשה שימוש בפרויקט Firebase שמבוסס על אפליקציית ההפעלה המהירה DatabaseExample ומשולב עם Firebase App Check, כפי שמתואר ב-Firebase App Check for Apple Platforms codelab. אפליקציית ההפעלה המהירה DatabaseExample מאפשרת למשתמשים להתחבר ולהוסיף פוסטים באמצעות התכונות של Firebase Realtime Database.
אפשר גם להתאים את השלבים ב-codelab הזה כדי לבדוק אפליקציה משלכם.
דרישות מוקדמות
מה צריך
- Xcode 12.5 ואילך
- לצורך בדיקה של App Attest:
- חשבון Apple Developer שמאפשר ליצור מזהי אפליקציות חדשים
- אפליקציה עם מזהה אפליקציה מפורש שמופעלת בה היכולת 'אימות אפליקציה'. אם אתם צריכים עזרה בתהליך, תוכלו לעיין במאמרים בנושא רישום מזהה אפליקציה והפעלת יכולות של אפליקציה.
- מכשיר iOS או iPadOS שתומך ב-App Attest
- פרויקט Firebase עם:
- אפליקציית iOS שהוגדרה (מידע נוסף)
- Google Analytics, Remote Config ו-App Check מופעלים
- גישה לפרויקט Firebase המשויך לאפליקציה, עם הרשאות ליצור ולנהל את Remote Config ולצפות ב-Google Analytics
2. יצירת ספק אימות בהתאמה אישית
בשלב הזה, ניצור מחלקה של ספק בהתאמה אישית כדי לספק אסימון רק כשמופעלת התכונה App Attest. הגדרת התצורה מרחוק מסתמכת על מופע מוגדר של אפליקציית Firebase, והספק המותאם אישית שמטמיעים בשלב הזה משמש כplaceholder לסיום ההגדרה.
כדי להשלים את השלבים הבאים, צריך להוסיף את Firebase
, FirebaseRemoteConfig
ו-FirebaseAnalytics
בקטע Frameworks, Libraries, and Embedded Content באפליקציה ב-Xcode. דוגמה לאופן הביצוע מופיעה בסדנת הקוד בנושא Firebase App Check לפלטפורמות של Apple.
- יוצרים קובץ בשם MyAppCheckProvider שהוא מחלקת משנה של
NSObject
שתואמת לפרוטוקולAppCheckProvider
. - כוללים שיטת
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)
}
הקוד הקודם בודק פרמטר בוליאני של הגדרת תצורה מרחוק AppAttestEnabled
(הפרמטר הזה של הגדרת התצורה מרחוק ייווצר בהמשך ב-codelab). אם הערך הוא False, הקוד נכשל, מה שמצביע על כך ש-App Check לא הופעל במכשיר הנוכחי. אם הערך הוא true, הקוד מנסה להשיג ספק של אימות אפליקציה, ואם הוא לא מצליח, הפעולה נכשלת. אם הבדיקות האלה לא יחזירו שגיאה, הקוד יעביר את בקשת האסימון לספק של App Attest.
הוספת אירועים ב-Analytics
הוספת אירועים של Analytics תעזור לכם לקבל תובנות טובות יותר לגבי מידת ההצלחה של השקת App Check. מערכת 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 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()
}
// ...
}
4. הוספת פרמטר של הגדרת תצורה מרחוק במסוף Firebase
עכשיו מוסיפים את הפרמטר AppAttestEnabled של הגדרת התצורה מרחוק למסוף Firebase . הפרמטר הזה נדרש לשיטת התשלום getToken
.
כדי ליצור פרמטר של הגדרת תצורה מרחוק במסוף Firebase :
- פותחים את הגדרת התצורה מרחוק בפרויקט ולוחצים על הוספת פרמטר. אם זו הפעם הראשונה שאתם משתמשים ב-Remote Config, לוחצים על יצירת הגדרה.
- בשדה שם הפרמטר (מפתח), מזינים
AppAttestEnabled
. - בתפריט הנפתח סוג נתונים, בוחרים באפשרות בוליאני.
- בתפריט הנפתח ערך ברירת מחדל, בוחרים באפשרות false.
לפני שלוחצים על Save, יוצרים ערך מותנה ל-10% מהמשתמשים:
- לוחצים על הוספת משתנה חדש > ערך מותנה > יצירת תנאי חדש.
- בשדה שם, מזינים שם לתנאי.
- בקטע התנאי חל אם..., בוחרים באפשרות משתמש באחוזון אקראי, באפשרות <=, ואז מזינים את הערך 10 בשדה %.
- לוחצים על יצירת תנאי.
מגדירים את הערך המותנה ל-true כדי שהאימות של האפליקציה יופעל אצל 10% מהמשתמשים.
- מגדירים את הערך true לתנאי שיצרתם.
- לוחצים על שמירה.
בסיום, מפרסמים את השינויים בהגדרת התצורה מרחוק.
בדיקת ההשקה במכשיר
כדי לבדוק את ערכי הדגל השונים של הגדרת התצורה מרחוק במכשיר בלי לשנות את קוד האפליקציה, צריך להגדיר ניסוי בפרמטר AppAttestEnabled לפי המדריך ליצירת ניסויים של הגדרת תצורה מרחוק ב-Firebase עם בדיקות A/B. בקטע ההדרכה אימות הניסוי במכשיר בדיקה מוסבר איך להקצות ערכים שונים למכשיר הבדיקה.
השלב האחרון הוא להשתמש ב-Google Analytics כדי לעקוב אחרי ההצלחה של השקת App Attest.
5. בדיקת ההצלחה של השקת AppCheck
אתם יכולים למדוד את הצלחת ההשקה בלוח הבקרה 'אירועים ב-Analytics'. צריך לעקוב אחרי האירועים AppAttestSuccess ו-AppAttestFailure. יכול להיות שיעברו עד 24 שעות לפני שהאירועים יופיעו בלוח הבקרה. לחלופין, אפשר להפעיל ניפוי באגים ולהשתמש ב-DebugView כדי לראות אירועי ניפוי באגים מהר יותר.
אפשר גם לעקוב אחרי לוחות הבקרה של Crashlytics כדי לזהות עלייה בשיעורי הקריסות. מידע נוסף על הוספת Crashlytics לאפליקציה זמין במאמר תחילת העבודה עם Firebase Crashlytics.
אם אתם רואים בעיקר אירועי AppAttestSuccess ומעט אירועי AppAttestFailure, זה סימן טוב לכך שאתם יכולים להגדיל את אחוז המשתמשים שהפעילו את App Attest. כדי לעשות זאת, צריך לשנות את התנאי בפרמטר AppAttestEnabled של Remote Config.
אופציונלי: שימוש בקהל מ-Google Analytics
אם רוצים להפיק תועלת נוספת מהאירוע AppAttestEnabled ב-Analytics, אפשר ליצור קהל ב-Analytics כדי לעקוב אחרי משתמשים שהערך של AppAttestEnabled שלהם מוגדר כ-True.
התכונה 'אימות אפליקציות' הושקה עם iOS 14.0. יכול להיות שחלק מהמשתמשים שלך לא משתמשים בגרסה הזו, ולכן לא עומדים בדרישות לשימוש ב-App Attest. אפשר לרשום ביומן אירוע נוסף ב-Analytics כדי לעקוב אחרי המשתמשים האלה, ואז לטרגט את הקהל הזה בשיטת אימות אחרת, כמו DeviceCheck.
אופציונלי: שימוש ב-Crashlytics כדי לעקוב אחרי קריסות
כדי להבין טוב יותר את יציבות האפליקציה במהלך ההשקה, כדאי להשתמש ב-Firebase Crashlytics כדי לעקוב אחרי קריסות ושגיאות לא קריטיות.
6. כל הכבוד!
הטמעתם בהצלחה את App Check עם הגדרת תצורה מרחוק 🎉