בדיקת אפליקציית Firebase עבור פלטפורמות אפל

1. הקדמה

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

תוכל ללמוד עוד על Firebase App Check בתיעוד Firebase.

App Check משתמש בשירותים ספציפיים לפלטפורמה כדי לאמת את תקינותם של אפליקציה ו/או מכשיר. שירותים אלה נקראים ספקי אישורים . ספק אחד כזה הוא שירות App Attest של אפל, שבו App Check יכולה להשתמש כדי לאמת את האותנטיות של אפליקציות ומכשירי אפל.

מה שתבנה

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

מה תלמד

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

מה אתה צריך

  • Xcode 13.3.1 ואילך
  • חשבון Apple Developer המאפשר לך ליצור מזהי אפליקציות חדשים
  • מכשיר iOS/iPadOS התומך App Attest (למד על זמינות App Attest API )

2. קבלו את פרויקט ההתחלה

מאגר Firebase Quickstarts עבור iOS מכיל אפליקציות לדוגמה להדגמת מוצרי Firebase שונים. אתה תשתמש באפליקציית Firebase Database Quickstart עבור SwiftUI כבסיס למעבדת קוד זה.

שיבוט את מאגר ההתחלה המהירה של Firebase עבור iOS משורת הפקודה:

git clone https://github.com/firebase/quickstart-ios.git
cd quickstart-ios

פתח את פרוייקט אפליקציית SwiftUI Quickstart של מסד נתונים בזמן אמת ב-Xcode:

cd database/DatabaseExampleSwiftUI/DatabaseExample
xed .

3. הוסף App Check לאפליקציה שלך

  1. המתן שמנהל החבילות של Swift יפתור את התלות של הפרויקט.
  2. פתח את הכרטיסייה כללי של יעד האפליקציה DatabaseExample (iOS) . לאחר מכן, במקטע מסגרות, ספריות ותוכן מוטבע , לחץ על הלחצן + .
  3. בחר כדי להוסיף FirebaseAppCheck .

4. צור והתקן את המפעל של ספק בדיקת האפליקציות

  1. בקבוצת הקבצים Shared , הוסף קבוצה חדשה בשם AppCheck .
  2. בתוך קבוצה זו, צור מחלקה מפעל בקובץ נפרד, למשל MyAppCheckProviderFactory.swift , הקפד להוסיף אותו ליעד DatabaseExample (iOS) :
    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.
          return AppCheckDebugProvider(app: app)
        #else
          // Use App Attest provider on real devices.
          return AppAttestProvider(app: app)
        #endif
      }
    }
    
  3. לאחר מכן, ב- DatabaseExampleApp.swift , הקפד לייבא FirebaseAppCheck , והגדר מופע של המחלקה MyAppCheckProviderFactory כמפעל ספק ה-App Check.
    import SwiftUI
    import FirebaseCore
    import FirebaseAppCheck
    
    @main
    struct DatabaseExampleApp: App {
      init() {
        // Set an instance of MyAppCheckProviderFactory as an App Check
        // provider factory before configuring Firebase.
        AppCheck.setAppCheckProviderFactory(MyAppCheckProviderFactory())
        FirebaseApp.configure()
      }
      ...
    }
    

5. צור והגדר פרויקט Firebase

כדי להשתמש ב-App Check בפרויקט iOS שלך, עליך לבצע את השלבים הבאים במסוף Firebase:

  • הגדר פרויקט Firebase.
  • הוסף את אפליקציית iOS שלך לפרויקט Firebase.
  • הגדר את אימות Firebase.
  • אתחל את מופע מסד הנתונים בזמן אמת שאתה הולך להגן עליו.
  • הגדר את בדיקת האפליקציה.

צור פרויקט

ראשית, עליך ליצור פרויקט Firebase.

  1. במסוף Firebase , בחר הוסף פרויקט .
  2. תן שם לפרויקט שלך App Check Codelab
  3. לחץ על המשך.
  4. השבת את Google Analytics עבור פרויקט זה ולאחר מכן לחץ על צור פרויקט.

צור מופע של מסד נתונים בזמן אמת

כעת, נווט לקטע מסד נתונים בזמן אמת של מסוף Firebase.

  1. לחץ על הלחצן צור מסד נתונים כדי להתחיל את זרימת העבודה של יצירת מסד הנתונים.
  2. השאר את מיקום ברירת המחדל ( us-central1 ) עבור מסד הנתונים ללא שינוי, ולחץ על הבא .
  3. ודא שמצב נעול נבחר ולחץ על כפתור הפעל כדי להפעיל את כללי האבטחה עבור מסד הנתונים שלך.
  4. נווט אל הכרטיסייה כללים של הדפדפן Realtime Database, והחלף את כללי ברירת המחדל עם הכללים הבאים:
    {
        "rules": {
            // User profiles are only readable/writable by the user who owns it
            "users": {
                "$UID": {
                    ".read": "auth.uid == $UID",
                    ".write": "auth.uid == $UID"
                }
            },
            // Posts can be read by anyone but only written by logged-in users.
            "posts": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    // UID must match logged in user and is fixed once set
                    "uid": {
                        ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                    },
                    // User can only update own stars
                    "stars": {
                        "$UID": {
                            ".validate": "auth.uid == $UID"
                        }
                    }
                }
            },
            // User posts can be read by anyone but only written by the user that owns it,
            // and with a matching UID
            "user-posts": {
                ".read": true,
                "$UID": {
                    "$POSTID": {
                        ".write": "auth.uid == $UID",
                        ".validate": "data.exists() || newData.child('uid').val() == auth.uid"
                    }
                }
            },
            // Comments can be read by anyone but only written by a logged in user
            "post-comments": {
                ".read": true,
                ".write": "auth.uid != null",
                "$POSTID": {
                    "$COMMENTID": {
                        // UID must match logged in user and is fixed once set
                        "uid": {
                            ".validate": "(data.exists() && data.val() == newData.val()) || newData.val() == auth.uid"
                        }
                    }
                }
            }
        }
    }
    
  5. לחץ על הלחצן פרסם כדי להפעיל את כללי האבטחה המעודכנים.

הכן את אפליקציית iOS שלך לחיבור ל-Firebase

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

  1. ב-Xcode, בחר בפרויקט DatabaseExample בנווט הפרויקט.
  2. בחר ביעד DatabaseExample (iOS) ופתח את הכרטיסייה חתימה ויכולות .
  3. אתה אמור לראות הודעת שגיאה האומרת "חתימה עבור דוגמה למאגר נתונים (iOS) דורשת צוות פיתוח" .
  4. עדכן את מזהה החבילה למזהה ייחודי. הדרך הקלה ביותר להשיג זאת היא על ידי שימוש בשם הדומיין ההפוך של האתר שלך, לדוגמה com.acme.samples.firebase.quickstart.DatabaseExample (נא לא להשתמש במזהה זה; במקום זאת בחר מזהה ייחודי משלך).
  5. בחר את צוות הפיתוח שלך.
  6. תדע שהכל הלך כשורה כאשר Xcode מציג את "פרופיל אספקה: פרופיל מנוהל Xcode" וסמל מידע קטן ליד התווית הזו. לחיצה על סמל זה תציג פרטים נוספים על פרופיל ההקצאה.

חבר את אפליקציית iOS שלך

להסבר מעמיק על חיבור האפליקציה שלך, עיין בתיעוד על הוספת Firebase לפרויקט iOS שלך . כדי להתחיל, בצע את השלבים העיקריים הבאים במסוף Firebase:

  1. ממסך סקירת הפרויקט של הפרויקט החדש שלך, לחץ על הלחצן + הוסף אפליקציה ולאחר מכן לחץ על סמל iOS+ כדי להוסיף אפליקציית iOS חדשה לפרויקט Firebase שלך.
  2. הזן את מזהה החבילה של האפליקציה שלך (השתמש בזה שהגדרת בסעיף הקודם, כגון com.acme.samples.firebase.quickstart.DatabaseExample - זכור שזה חייב להיות מזהה ייחודי)
  3. לחץ על הרשמה אפליקציה .
  4. Firebase יוצר קובץ GoogleService-Info.plist המכיל את כל המטא נתונים הדרושים של Firebase עבור האפליקציה שלך.
  5. לחץ על הורד את GoogleService-Info.plist כדי להוריד את הקובץ.
  6. ב-Xcode, תראה שהפרויקט כבר מכיל קובץ בשם GoogleService-Info.plist . מחק תחילה את הקובץ הזה - תחליף אותו בקובץ עבור פרויקט Firebase משלך בשלב הבא.
  7. העתק את קובץ GoogleService-Info.plist שהורדת בשלב הקודם לתיקיית הבסיס של פרויקט Xcode שלך ​​והוסף אותו ליעד DatabaseExample (iOS) , וודא שהוא נקרא GoogleService-Info.plist
  8. לחץ על שאר השלבים של זרימת ההרשמה. מכיוון שהפרויקט לדוגמה כבר מוגדר כהלכה, אין צורך לבצע שינויים כלשהם בקוד.

הגדר את אימות Firebase

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

כעת, תגדיר את אימות Firebase עבור האפליקציה הזו.

הפעל ספק כניסה לאימות דואר אלקטרוני/סיסמה

  1. עדיין במסוף Firebase , פתח את קטע האימות של המסוף.
  2. לחץ על התחל כדי להגדיר אימות Firebase עבור הפרויקט שלך.
  3. בחר בכרטיסייה שיטת כניסה .
  4. בחר אימייל/סיסמה בקטע ספקים מקוריים .
  5. הפעל אימייל/סיסמה ולחץ על שמור .

הוסף משתמש לבדיקה

  1. פתח את הכרטיסייה משתמשים בקטע אימות .
  2. לחץ על הוסף משתמש .
  3. ציין דוא"ל וסיסמה עבור משתמש הבדיקה שלך, ולאחר מכן לחץ על הוסף משתמש .

קח את האפליקציה לסיבוב

חזור אל Xcode, והפעל את האפליקציה בסימולטור iOS. היכנס עם הדוא"ל והסיסמה של משתמש הבדיקה שיצרת זה עתה. לאחר הכניסה, צור פוסט, פרסם תגובה לפוסט קיים, וסמן/בטל כוכב פוסטים.

6. הגדר ספק אישור App Attest

בשלב זה, תגדיר App Check להשתמש בספק App Attest במסוף Firebase.

  1. במסוף Firebase, נווט אל הקטע App Check של המסוף.
  2. לחץ על התחל .
  3. בכרטיסייה אפליקציות , לחץ על האפליקציה שלך כדי להרחיב את פרטיה.
  4. לחץ על App Attest כדי להגדיר App Attest, ולאחר מכן הזן את מזהה הצוות של חשבון המפתחים שלך ב-Apple (תוכל למצוא זאת בסעיף החברות בפורטל המפתחים של Apple): 1645f7a369b678c2.png
  5. לחץ על שמור .

עם זה, יש לך פרויקט Firebase עובד שמחובר לאפליקציה החדשה שלנו, ו-App Check מופעל.

כעת אתה מוכן להגדיר את שירות האישורים הספציפי שלנו! למידע נוסף על זרימת עבודה זו, ראה הפעל בדיקת אפליקציה עם אישור אפליקציה ב-iOS .

7. הגדר App Attest עבור היישום שלך

עכשיו הגיע הזמן לשים את היד על ה- Firebase App Check SDK וליישם קוד לקוח כלשהו.

ראשית, עליך להגדיר את פרויקט Xcode כך שה-SDK יוכל להשתמש ב-App Attest API של אפל כדי להבטיח שבקשות שנשלחות מהאפליקציה שלך מגיעות ממופעים לגיטימיים של האפליקציה שלך.

  1. הוסף את יכולת App Attest עבור יעד האפליקציה שלך בפרויקט Xcode:
  2. פתח את הכרטיסייה חתימה ויכולות בהגדרות היעד של האפליקציה שלך
  3. לחץ על הלחצן " + ".
  4. בתיבת הדו-שיח, מצא ובחר יכולת App Attest ae84cd988a5fab31.png
  5. קובץ DatabaseExample (iOS).entitlements יופיע בתיקיית השורש של פרויקט Xcode שלך ​​לאחר ביצוע השלב הקודם.
  6. בקובץ DatabaseExample (iOS).entitlements , שנה את הערך עבור מפתח App Attest Environment production.

לאחר שתסיים את השלבים האלה ותפעיל את האפליקציה במכשיר iOS פיזי (iPhone/iPad), האפליקציה עדיין תוכל לגשת למסד הנתונים בזמן אמת. בשלב מאוחר יותר, תאכוף App Check, אשר יחסום בקשות שנשלחות מאפליקציות ומכשירים לא לגיטימיים.

למידע נוסף על זרימת עבודה זו, ראה הפעל בדיקת אפליקציה עם אישור אפליקציה ב-iOS .

8. הגדר ספק אישור באגים עבור סימולטור iOS

ספק Firebase App Check Debug מאפשר לבדוק יישומים עם אכיפה של Firebase App Check בסביבות לא מהימנות, כולל סימולטור iOS, במהלך תהליך הפיתוח. לאחר מכן, עליך להגדיר את ספק ניפוי הבאגים ביחד.

התקן את ספק ניפוי הבאגים של Firebase באפליקציה שלך

אפשרות 1: צור באופן מותנה מופע של ספק ניפוי הבאגים במפעל שלך

עשית את רוב זה כשיצרת את המפעל של ספק בדיקת האפליקציות. בשלב זה, תוסיף רישום של סוד ניפוי הבאגים המקומי שנוצר על ידי ספק ניפוי הבאגים, כך שתוכל לרשום מופע זה של האפליקציה במסוף Firebase למטרות ניפוי באגים.

עדכן את 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
    // Use App Attest provider on real devices.
    return AppAttestProvider(app: app)
#endif
  }
}

גישה זו מעניקה לנו גמישות רבה יותר להגדרת App Check בהתאם לסביבה. לדוגמה, אתה יכול להשתמש בספקי אישורים אחרים כמו DeviceCheck או ספק אישור מותאם אישית בגרסאות מערכת ההפעלה שבהן App Attest אינו זמין. ראה דוגמה למטה:

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 App Attest provider on real devices.
        return AppAttestProvider(app: app)
      } else {
        return DeviceCheckProvider(app: app)
      }
      #endif
  }
}

אפשרות 2: התקן את AppCheckDebugProviderFactory

במקרים פשוטים יותר, תוכל להתקין באופן זמני או מותנה את AppCheckDebugProviderFactory לפני קביעת התצורה של מופע היישום Firebase:

init() {
#if targetEnvironment(simulator)
  let providerFactory = AppCheckDebugProviderFactory()
#else
  let providerFactory = MyAppCheckProviderFactory()
#endif

  AppCheck.setAppCheckProviderFactory(providerFactory)

  FirebaseApp.configure()
}

זה יחסוך לך כמה שורות קוד ביצירת מפעל משלך לספק בדיקת אפליקציות.

רשום את סוד ניפוי הבאגים שלך במסוף Firebase

קבל את סוד ניפוי הבאגים מסימולטור iOS שלך

  1. אם בחרת להתקין AppCheckDebugProviderFactory (אפשרות 2 למעלה), עליך להפעיל רישום באגים עבור האפליקציה שלך על ידי הוספת -FIRDebugEnabled לארגומנטים של הפעלת האפליקציה: f1c6b477a373e144.png
  2. הפעל את האפליקציה שלך בסימולטור
  3. מצא את סוד ניפוי הבאגים במסוף Xcode. אתה יכול להשתמש במסנן המסוף כדי למצוא אותו מהר יותר: d4c65af93e369c55.png

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

רשום את סוד ניפוי הבאגים

  1. בחזרה למסוף Firevbase, עבור לקטע בדיקת אפליקציות .
  2. בכרטיסייה אפליקציות , לחץ על האפליקציה שלך כדי להרחיב את פרטיה.
  3. בתפריט ההצפה, בחר נהל אסימוני ניפוי באגים : d77c8ff768a00b4b.png
  4. הוסף את הסוד שהעתקת ממסוף Xcode ולאחר מכן לחץ על שמור f845c97b86f694d0.png

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

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

פרטים נוספים על זרימה זו ניתן למצוא בתיעוד - ראה שימוש בבדיקת אפליקציה עם ספק ניפוי הבאגים ב-iOS .

9. אפשר אכיפת בדיקת אפליקציות עבור מסד נתונים בזמן אמת של Firebase

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

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

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

64e6a81fa979b635.png

  1. קרא את המידע בתיבת הדו-שיח לאישור ולאחר מכן לחץ על אכוף .

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

נסה לגשת למסד הנתונים בזמן אמת באמצעות אפליקציה לא לגיטימית

כדי לראות את האכיפה של בדיקת אפליקציות בפעולה, בצע את השלבים הבאים:

  1. כבה את הרישום של App Check על ידי הערה על קוד הרישום App Check בשיטת init של נקודת הכניסה לאפליקציה שלך ב- DatabaseExampleApp .
  2. אפס את הסימולטור על ידי בחירה במכשיר > מחק את כל התוכן וההגדרות . פעולה זו תמחק את הסימולטור (ותבטל את תוקף אסימון המכשיר).
  3. הפעל את האפליקציה שוב בסימולטור.
  4. כעת אתה אמור לראות את הודעת השגיאה הבאה:
    [FirebaseDatabase][I-RDB034005] Firebase Database connection was forcefully killed by the server.  Will not attempt reconnect. Reason: Invalid appcheck token.
    

כדי להפעיל מחדש App Check, בצע את הפעולות הבאות:

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

10. מזל טוב!

9785d32f18b995d2.gif

עכשיו אתה יודע איך:

  • הוסף App Check לפרויקט קיים
  • הגדר ספק אישור אפליקציה עבור גרסת הייצור של האפליקציה שלך
  • הגדר ספק אישור באגים כדי לבדוק את האפליקציה שלך בסימולטור
  • צפה בהשקת גרסת האפליקציה כדי לדעת מתי לאכוף App Check עבור פרויקט Firebase שלך
  • הפעל אכיפת בדיקת אפליקציות

הצעדים הבאים

למד כיצד להשתמש ב-Remote Config כדי להפעיל בהדרגה את App Check למשתמשים שלך ב- Remote App Check בהדרגה של Firebase App Check באמצעות מעבד הקוד של Firebase Remote Config

אלו הם משאבים אחרים שעשויים להיות מועילים

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