אימות עם Firebase באמצעות חשבונות מבוססי-סיסמה בפלטפורמות של Apple

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

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

משתמשים ב-Swift Package Manager כדי להתקין ולנהל יחסי תלות ב-Firebase.

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

לאחר מכן, מבצעים כמה שלבי הגדרה:

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

יצירת חשבון שמבוסס על סיסמה

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

  1. מייבאים את המודול FirebaseCore ב-UIApplicationDelegate, וגם את כל מודולי Firebase אחרים שמשמשים את נציג האפליקציה. לדוגמה, כדי להשתמש ב-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 בשיטה 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, אתם צריכים ליצור נציג אפליקציה ולצרף אותו למבנה App באמצעות UIApplicationDelegateAdaptor או NSApplicationDelegateAdaptor. צריך גם להשבית את החלפת השיטות של נציג האפליקציה. מידע נוסף זמין בהוראות ל-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. כשמשתמש חדש נרשם באמצעות טופס ההרשמה של האפליקציה, צריך להשלים את כל שלבי האימות של החשבון החדש שהאפליקציה דורשת, כמו אימות הסיסמה של החשבון החדש כדי לוודא שהיא הוזנה בצורה נכונה ועומדת בדרישות המורכבות שלכם.
  5. יוצרים חשבון חדש על ידי העברת כתובת האימייל והסיסמה של המשתמש החדש אל createUser.

    Swift

    Auth.auth().createUser(withEmail: email, password: password) { authResult, error in
      // ...
    }

    Objective-C

    [[FIRAuth auth] createUserWithEmail:email
                               password:password
                             completion:^(FIRAuthDataResult * _Nullable authResult,
                                          NSError * _Nullable error) {
      // ...
    }];
    אם החשבון החדש נוצר בהצלחה, המשתמש מחובר ואפשר לקבל את נתוני החשבון של המשתמש מאובייקט התוצאה שמועבר לשיטת הקריאה החוזרת.

כניסה של משתמש באמצעות כתובת אימייל וסיסמה

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

  1. מייבאים את המודול FirebaseCore ב-UIApplicationDelegate, וגם את כל מודולי Firebase אחרים שמשמשים את נציג האפליקציה. לדוגמה, כדי להשתמש ב-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 בשיטה 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, אתם צריכים ליצור נציג אפליקציה ולצרף אותו למבנה App באמצעות UIApplicationDelegateAdaptor או NSApplicationDelegateAdaptor. צריך גם להשבית את החלפת השיטות של נציג האפליקציה. מידע נוסף זמין בהוראות ל-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. כשמשתמש נכנס לאפליקציה שלכם, מעבירים את כתובת האימייל והסיסמה של המשתמש אל signIn.

    Swift

    Auth.auth().signIn(withEmail: email, password: password) { [weak self] authResult, error in
      guard let strongSelf = self else { return }
      // ...
    }

    Objective-C

    [[FIRAuth auth] signInWithEmail:self->_emailField.text
                           password:self->_passwordField.text
                         completion:^(FIRAuthDataResult * _Nullable authResult,
                                      NSError * _Nullable error) {
      // ...
    }];
    אם המשתמש מצליח להיכנס, אפשר לקבל את נתוני החשבון שלו מאובייקט התוצאה שמועבר לשיטת הקריאה החוזרת (callback).

מומלץ: הגדרת מדיניות לסיסמאות

כדי לשפר את אבטחת החשבון, אפשר לאכוף דרישות למורכבות הסיסמה.

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

הגדרות אימות

מדיניות הסיסמאות של Firebase Authentication תומכת בדרישות הסיסמה הבאות:

  • חובה להשתמש באותיות קטנות

  • נדרשת אות גדולה

  • חובה להזין תו מספרי

  • נדרש תו שאינו אלפאנומרי

    התווים הבאים עומדים בדרישה לתווים שאינם אלפאנומריים: ^ $ * . [ ] { } ( ) ? " ! @ # % & / \ , > < ' : ; | _ ~

  • אורך סיסמה מינימלי (הטווח הוא 6 עד 30 תווים; ברירת המחדל היא 6)

  • אורך הסיסמה המקסימלי (אורך מקסימלי של 4,096 תווים)

אפשר להפעיל את אכיפת המדיניות בנושא סיסמאות בשני מצבים:

  • חובה: ניסיונות ההרשמה ייכשלו עד שהמשתמש יעבור לסיסמה שתואמת למדיניות.

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

משתמשים חדשים תמיד נדרשים לבחור סיסמה שעומדת בדרישות המדיניות שלכם.

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

מומלץ: הפעלת הגנה מפני ספירת כתובות אימייל

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

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

השלבים הבאים

אחרי שהמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר לפרטי הכניסה – כלומר, שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האימות – שבאמצעותם המשתמש נכנס לחשבון. החשבון החדש הזה נשמר כחלק מפרויקט 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;
}

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