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

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

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

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

  1. ב-Xcode, כשפרויקט האפליקציה פתוח, עוברים אל קובץ > הוספת חבילות.
  2. כשמופיעה בקשה, מוסיפים את המאגר של Firebase SDK לפלטפורמות של Apple:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. בוחרים את הספרייה Firebase Authentication.
  5. מוסיפים את הדגל -ObjC לקטע Other Linker Flags (דגלים אחרים של קישור) בהגדרות ה-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 ב-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, עליכם ליצור נציג מורשה לאפליקציה ולצרף אותו ל-build של 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) {
      // ...
    }];
    אם החשבון החדש נוצר בהצלחה, המשתמש נכנס לחשבון ותוכלו לקבל את נתוני החשבון שלו מאובייקט התוצאה שמוענק לשיטת ה-callback.

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

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

  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.

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

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

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

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