אימות עם Firebase בפלטפורמות של Apple באמצעות מערכת אימות בהתאמה אישית

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

לפני שמתחילים

  1. אם עדיין לא עשיתם זאת, צרו פרויקט ב-Firebase ורשמו את האפליקציה.
  2. משתמשים ב-Swift Package Manager כדי להתקין ולנהל את יחסי התלות של Firebase.

    1. ב-Xcode, כשהפרויקט של האפליקציה פתוח, עוברים אל File > Add Packages (קובץ > הוספת חבילות).
    2. כשמוצגת בקשה, מוסיפים את מאגר ה-SDK של Firebase לפלטפורמות של אפל:
    3.   https://github.com/firebase/firebase-ios-sdk.git
    4. בוחרים בספרייה Firebase Authentication.
    5. מוסיפים את הדגל -ObjC לקטע Other Linker Flags (דגלים אחרים של מקשרים) בהגדרות ה-build של היעד.
    6. אחרי שתסיימו, פלטפורמת Xcode תתחיל לטפל ביחסי התלות ולהוריד אותם באופן אוטומטי ברקע.
  3. משיגים את מפתחות השרת של הפרויקט:
    1. במסוף Firebase, נכנסים לכרטיסייה Settings > Service accounts.
    2. בחלק התחתון של הקטע SDK של Firebase לאדמינים, לוחצים על יצירת מפתח פרטי חדש.
    3. זוג המפתחות הציבורי/פרטי של חשבון השירות החדש נשמר באופן אוטומטי במחשב. מעתיקים את הקובץ הזה לשרת האימות (AS).

אימות באמצעות Firebase

  1. מייבאים את המודול FirebaseCore בקובץ UIApplicationDelegate, וגם כל מודול Firebase אחר שבו משתמש ה-app delegate. לדוגמה, כדי להשתמש ב-Cloud Firestore וב-Authentication:

    SwiftUI

    import SwiftUI
    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Swift

    import FirebaseCore
    import FirebaseFirestore
    import FirebaseAuth
    // ...
          

    Objective-C

    @import FirebaseCore;
    @import FirebaseFirestore;
    @import FirebaseAuth;
    // ...
          
  2. מגדירים מופע משותף של FirebaseApp ב-method‏ application(_:didFinishLaunchingWithOptions:) של נציג האפליקציה:

    SwiftUI

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
  3. אם אתם משתמשים ב-SwiftUI, אתם צריכים ליצור נציג של האפליקציה ולצרף אותו ל-struct של App באמצעות UIApplicationDelegateAdaptor או NSApplicationDelegateAdaptor. צריך גם להשבית את ה-swizzling של ה-app delegate. מידע נוסף זמין בהוראות של SwiftUI.

    SwiftUI

    @main
    struct YourApp: App {
      // register app delegate for Firebase setup
      @UIApplicationDelegateAdaptor(AppDelegate.self) var delegate
    
      var body: some Scene {
        WindowGroup {
          NavigationView {
            ContentView()
          }
        }
      }
    }
          
  4. כשמשתמשים נכנסים לאפליקציה, שולחים את פרטי הכניסה שלהם (לדוגמה, שם המשתמש והסיסמה) לשרת האימות (AS). השרת בודק את פרטי הכניסה ומחזיר אסימון בהתאמה אישית אם הם תקינים.
  5. אחרי שמקבלים את הטוקן המותאם אישית משרת האימות, מעבירים אותו אל signInWithCustomToken כדי להכניס את המשתמש:

    Swift

    Auth.auth().signIn(withCustomToken: customToken ?? "") { user, error in
      // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithCustomToken:customToken
                               completion:^(FIRAuthDataResult * _Nullable authResult,
                                            NSError * _Nullable error) {
      // ...
    }];

השלבים הבאים

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

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

  • בכללי האבטחה של Firebase Realtime Database ו-Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה auth, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.

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

כדי להוציא משתמש מהחשבון, מפעילים את signOut:.

Swift

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

כדאי גם להוסיף קוד לטיפול בשגיאות לכל מגוון שגיאות האימות. איך מטפלים בשגיאות