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

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

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

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

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

לאחר מכן מבצעים כמה פעולות הגדרה:

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

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

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

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

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

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

כדי להגדיר מדיניות סיסמאות לפרויקט, פותחים את הכרטיסייה Password policy בדף Authentication Settings במסוף 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;
}

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