איך משתמשים ב-App Check כדי לאבטח את Navigation SDK ל-iOS

Firebase App Check מספקת הגנה על קריאות מהאפליקציה שלכם ל-Google Maps Platform, על ידי חסימת תעבורת נתונים שמגיעה ממקורות שאינם האפליקציות הלגיטימיות שלכם. היא עושה זאת על ידי בקשת הערכה של האותנטיות של האפליקציה או המכשיר מספק אישורים כמו App Attest. כשמשלבים את האפליקציה עם App Check, מוסיפים הגנה מפני בקשות זדוניות ולא מורשות, וכך מגינים על החיוב מפני חיובים לא מורשים. בנוסף, App Check משפר באופן משמעותי את הדיווח בזמן אמת על שיבושים בסביבת האפליקציות של Fleet, וכך מועילה לכל הנהגים שמשתמשים באפליקציה. מידע נוסף זמין במאמר דיווח על שיבושים.

למה כדאי להשתמש ב-App Check?

הכלי App Check מגן על שני תחומים נפרדים ב-Navigation SDK ל-iOS: פונקציונליות הניווט הראשית ודיווח על שיבושים.

התכונה App Check עוזרת לחסום בקשות של Navigation SDK for iOS שמגיעות ממקורות זדוניים או לא מורשים. הפעולה הזו מגינה על הפרויקט שלכם מפני הונאות חיובים וניצול המכסות, ומועילה לכם באופן ישיר.

דיווח על שיבושים

מומלץ מאוד להשתמש ב-App Check אם האפליקציה שלכם תומכת בדיווח על שיבושים בזמן אמת וביכולות הצבעה. הפעלת App Check מבטיחה שהנהגים יקבלו את המסלולים המדויקים ביותר, תוך התחשבות בכל המשוב בזמן אמת.

למה App Check חשוב לדיווח:

  • רמת האמינות הגבוהה של חסימות: אירועים שמשפיעים על המסלול, כמו חסימות כבישים, יכולים לשנות באופן משמעותי את התנהגות הניתוב של כל הנהגים. כדי להגן על המפה מפני ונדליזם, ספאם או דיווחים לא מדויקים, תשתית הניהול של Google לשיבושים שקשורים לחסימות כבישים מסתמכת על אותות חזקים של תקינות המכשיר ותקינות האפליקציה.
  • איך App Check מאמת דיווחים: דיווחים והצבעות של משתמשים שנשלחים מ-Navigation SDK ל-iOS כוללים את האסימון של App Check, שמשמש את הקצה העורפי של Google כדי לאמת את הלגיטימיות של המשוב, להעלות את רמת המהימנות שלו ולאפשר להעריך את ההשפעה שלו על המפה בזמן אמת.
  • ההשפעה של השמטת App Check: דוחות שנשלחים בלי אסימון App Check תקף נבדקים לפי מודל של רמת אמון נמוכה יותר, ויכול להיות שהם יעובדו רק כאותות שקטים. המשמעות היא שהמשתמשים עדיין יכולים לדווח ולהצביע, אבל יש פחות סיכוי שהדיווחים שלהם יופיעו במפה או ישפיעו על המסלולים של נהגים אחרים, והם יצטרכו אימות נוסף.

האם App Check מתאים לי?

ברוב המקרים מומלץ להשתמש ב-App Check, אבל אין צורך ב-App Check או שהיא לא נתמכת בתרחישים הבאים:

  • אפליקציות פרטיות או ניסיוניות: אם האפליקציה לא נגישה לציבור, לא צריך להשתמש ב-App Check.
  • מכשירים שנפרצו: ספקי האימות המומלצים מונעים את ההפעלה של Navigation SDK ל-iOS במכשירים לא מהימנים, כמו טלפונים שעברו רוט או פריצה. כדי לתמוך במכשירים האלה, צריך לפרוס ספק אישורים בהתאמה אישית.

סקירה כללית של שלבי ההטמעה

ככלל, אלה השלבים לשילוב האפליקציה עם App Check:

  1. מוסיפים את Firebase לאפליקציה.
  2. מוסיפים את הספרייה של App Check ומפעילים את App Check.
  3. מוסיפים ספק אסימונים. בשלב הזה, ספק האימות שבחרתם נקרא לאמת את תקינות המכשיר או האפליקציה.
  4. מפעילים את Navigation API ואת App Check API.
  5. מפעילים את ניפוי הבאגים. האפשרות הזו שימושית במהלך הפיתוח או בסביבות של שילוב רציף (CI).
  6. לפני שמפעילים את האכיפה, כדאי לעקוב אחרי הבקשות של האפליקציה. כך תוכלו לאכוף את השימוש ב-App Check בצורה חלקה בלי לשבש את חוויית המשתמש.

שיקולים בתכנון שילוב של App Check

  • מכסות של ספקי אימות: ספקי האימות שאנחנו ממליצים עליהם, DeviceCheck או App Attest, כפופים למכסות ולמגבלות שנקבעו על ידי Apple.
  • זמן האחזור בהפעלה: ברוב המקרים, המשתמשים לא יחוו זמן אחזור במהלך שימוש רגיל, כי האסימונים של App Check נשמרים במטמון במכשיר. המערכת מרעננת אוטומטית את האסימונים של App Check ברקע לפני שהתוקף שלהם פג, כדי לשמור על ביצועים חלקים. עם זאת, אם לא קיים טוקן תקף של App Check, משתמשי האפליקציה יחוו השהיה מסוימת בהפעלה. לדוגמה, זמן האחזור הזה מתרחש במהלך הפעלות במצב התחלתי (cold start) כשהאסימון שנשמר במטמון חסר או שפג תוקפו.
  • אורך החיים (TTL) של האסימון: משך הזמן שבו האסימון של App Check תקף לפני שצריך לרענן אותו. אפשר להגדיר את משך הזמן הזה במסוף Firebase, מ-30 דקות ועד 7 ימים. מומלץ להגדיר משך של שעה כערך בסיסי מאובטח, אבל ה-SDK מנסה לבצע רענונים ברקע באופן אוטומטי בערך בחצי מהמשך של ה-TTL. הוראות מפורטות לגבי המסוף זמינות במסמכי התיעוד של Firebase App Check.

שילוב האפליקציה עם App Check

דרישות מוקדמות

  • אפליקציה עם Navigation SDK ל-iOS בגרסה 11.0 ואילך.
  • מזהה החבילה של האפליקציה.
  • מזהה הצוות שלכם מהכרטיסייה 'חברות' ב-Apple Developer Console.
  • אם אתם מתכננים להשתמש ב-DeviceCheck, תצטרכו את קובץ המפתח הפרטי ואת מזהה המפתח.
  • אתם צריכים להיות הבעלים של האפליקציה במסוף Google Cloud.
  • מזהה הפרויקט של האפליקציה ממסוף Google Cloud.

שלב 1: מוסיפים את Firebase לאפליקציה

פועלים לפי ההוראות במסמכי התיעוד למפתחים של Firebase כדי להוסיף את Firebase לאפליקציה. מוסיפים את קובץ GoogleService-Info.plist ללא שינוי לרמת הבסיס של הפרויקט.

בקובץ AppDelegate, מייבאים את המודולים הבאים:

Swift

import FirebaseCore
import FirebaseAppCheck
import GoogleNavigation

Objective-C

@import FirebaseCore;
@import FirebaseAppCheck;
@import GoogleNavigation;

שלב 2: מוסיפים את הספרייה של App Check ומפעילים את App Check

ב-Firebase יש הוראות לכל ספק אימות שמוגדר כברירת מחדל. במאמר הזה מוסבר איך להגדיר פרויקט ב-Firebase ולהוסיף את ספריית App Check לאפליקציה. כדי לאתחל את App Check, צריך לפעול לפי דוגמאות הקוד שמופיעות כאן.

  1. פועלים לפי ההוראות של Firebase כדי להוסיף את ספריית App Check:
  2. מפעילים את App Check ב-AppDelegate:
    • אם אתם משתמשים ב-App Attest, צרו הטמעה של AppCheckProviderFactory ורשמו אותה לפני הקריאה ל-FirebaseApp.configure():

      Swift

      class YourAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
          func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
              return AppAttestProvider(app: app)
          }
      }
      // In application(_:didFinishLaunchingWithOptions:)
      let providerFactory = YourAppCheckProviderFactory()
      AppCheck.setAppCheckProviderFactory(providerFactory)
      FirebaseApp.configure()

      Objective-C

      #import <FirebaseCore/FirebaseCore.h>
      #import <FirebaseAppCheck/FirebaseAppCheck.h>
      
      @interface YourAppCheckProviderFactory : NSObject <FIRAppCheckProviderFactory>
      @end
      
      @implementation YourAppCheckProviderFactory
      - (nullable id<FIRAppCheckProvider>)createProviderWithApp:(FIRApp *)app {
          return [[FIRAppAttestProvider alloc] initWithApp:app];
      }
      @end
      
      // In application:didFinishLaunchingWithOptions:
      YourAppCheckProviderFactory *providerFactory = [[YourAppCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];
      [FIRApp configure];
    • אם אתם משתמשים ב-DeviceCheck במקום זאת, צריך להגדיר את המפעל באמצעות הפעולות הבאות:

      Swift

      AppCheck.setAppCheckProviderFactory(DeviceCheckProviderFactory())

      Objective-C

      FIRDeviceCheckProviderFactory *providerFactory = [[FIRDeviceCheckProviderFactory alloc] init];
      [FIRAppCheck setAppCheckProviderFactory:providerFactory];

שלב 3: מוסיפים את ספק הטוקנים

יוצרים קובץ בשם AppCheckTokenProvider (או, אם משתמשים ב-Objective-C, שני קבצים בשמות AppCheckTokenProvider.h ו-AppCheckTokenProvider.m) ברמת הבסיס (root) של האפליקציה.

המחלקה הזו צריכה להתאים לפרוטוקול GMSAppCheckTokenProvider ולהטמיע את ה-method‏ fetchAppCheckTokenWithCompletion.

Swift

import Foundation
import FirebaseAppCheck
import GoogleNavigation

class AppCheckTokenProvider: NSObject, GMSAppCheckTokenProvider {
    func fetchAppCheckToken(completion: @escaping (String?, Error?) -> Void) {
        AppCheck.appCheck().token(forcingRefresh: false) { token, error in
            if let error = error {
                print("App Check Error: \(error)")
                completion(nil, error)
                return
            }
            guard let token = token else {
                completion(nil, NSError(domain: "AppCheck", code: -1, userInfo: [NSLocalizedDescriptionKey: "Token is nil"]))
                return
            }
            print("App Check Token: \(token.token)")
            completion(token.token, nil)
        }
    }
}

Objective-C

// AppCheckTokenProvider.h
#import <Foundation/Foundation.h>
#import <GoogleNavigation/GoogleNavigation.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppCheckTokenProvider : NSObject <GMSAppCheckTokenProvider>
@end

NS_ASSUME_NONNULL_END
// AppCheckTokenProvider.m
#import "AppCheckTokenProvider.h"
#import <FirebaseAppCheck/FirebaseAppCheck.h>

@implementation AppCheckTokenProvider
- (void)fetchAppCheckTokenWithCompletion:(void (^)(NSString * _Nullable token, NSError * _Nullable error))completion {
    [[FIRAppCheck appCheck] tokenForcingRefresh:NO
                                     completion:^(FIRAppCheckToken * _Nullable token, NSError * _Nullable error) {
        if (token) {
            completion(token.token, nil);
        } else {
            completion(nil, error);
        }
    }];
}
@end

שלב 4: מפעילים את Navigation API ואת App Check API

מאתחלים את Navigation SDK ל-iOS ורושמים את מופע ספק האסימונים ב-GMSServices:

Swift

// In application(_:didFinishLaunchingWithOptions:)
GMSServices.provideAPIKey("YOUR_API_KEY")

// Register your App Check token provider before initializing Navigation SDK for iOS
GMSServices.appCheckTokenProvider = AppCheckTokenProvider()

Objective-C

// In application:didFinishLaunchingWithOptions:
[GMSServices provideAPIKey:@"YOUR_API_KEY"];

// Register your App Check token provider before initializing Navigation SDK for iOS
GMSServices.appCheckTokenProvider = [[AppCheckTokenProvider alloc] init];

שלב 5: הפעלת ניפוי באגים (אופציונלי)

אחרי שתאכפו את App Check ב-Navigation SDK ל-iOS, התכונות של האפליקציה שתלויות ב-Navigation SDK ל-iOS לא יפעלו בסימולטור או בסביבת שילוב רציף (CI), כי הסביבות האלה לא נחשבות למכשירים תקינים. כדי להריץ את האפליקציה בסביבות האלה במהלך הפיתוח והבדיקה, צריך ליצור גרסת build לניפוי באגים של האפליקציה שמשתמשת בספק אימות לצורכי ניפוי באגים של App Check במקום בספק אימות בסביבת הייצור.

  1. מגדירים את יצרן ספקי אימות לצורכי ניפוי באגים ב-AppDelegate:

    Swift

    #if targetEnvironment(simulator)
    let providerFactory = AppCheckDebugProviderFactory()
    #else
    let providerFactory = YourAppCheckProviderFactory()
    #endif
    AppCheck.setAppCheckProviderFactory(providerFactory)

    Objective-C

    #if TARGET_OS_SIMULATOR
    id<FIRAppCheckProviderFactory> providerFactory = [[FIRAppCheckDebugProviderFactory alloc] init];
    #else
    id<FIRAppCheckProviderFactory> providerFactory = [[YourAppCheckProviderFactory alloc] init];
    #endif
    [FIRAppCheck setAppCheckProviderFactory:providerFactory];
  2. מפעילים את הרישום ביומן בפרויקט Xcode, מפעילים את האפליקציה ומאתרים את אסימון ניפוי הבאגים המקומי ביומן המסוף.
  3. מעתיקים את אסימון ניפוי הבאגים הזה ומוסיפים אותו למסוף Firebase. פרטים נוספים זמינים במסמכי התיעוד של ספק אימות לצורכי ניפוי באגים של Firebase App Check.

שלב 6: מעקב אחרי בקשות האפליקציה והחלטה לגבי אכיפה

לפני שמפעילים את האכיפה, כדאי לעקוב אחרי הבקשות של האפליקציה כדי לוודא שהמשתמשים הלגיטימיים לא יושפעו.

  1. כדי לראות את אחוז התנועה המאומתת לעומת התנועה הלא מאומתת, נכנסים למסך המדדים של App Check במסוף Firebase.
  2. אחרי שמוודאים שרוב התנועה מאומתת ושהמשתמשים הלגיטימיים עדכנו לגרסה של האפליקציה שכוללת את ההטמעה של App Check, מפעילים את האכיפה.
  3. אחרי שתפעילו את האכיפה, App Check ידחה את כל התנועה שלא כוללת אסימון App Check תקין.