ניהול משתמשים ב-Firebase

יצירת משתמש

יש ארבע דרכים ליצור משתמש חדש בפרויקט Firebase:

  • מבצעים קריאה ל-method‏ createUserWithEmailAndPassword().
  • כניסה של משתמש בפעם הראשונה באמצעות ספק זהויות מאוחד, כמו כניסה באמצעות חשבון Google, כניסה באמצעות פייסבוק או אפל.

אפשר גם ליצור משתמשים חדשים עם אימות באמצעות סיסמה בקטע 'אימות' במסוף Firebase, בדף 'משתמשים'.

קבלת פרופיל של משתמש

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

  • הזרמים authStateChanges, idTokenChanges ו-userChanges: המאזינים יקבלו את User הנוכחי או את null אם אף משתמש לא מאומת:

    FirebaseAuth.instance
      .authStateChanges()
      .listen((User? user) {
        if (user != null) {
          print(user.uid);
        }
      });
    

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

    על ידי מעקב אחרי מצב האימות, אפשר ליצור ממשק משתמש שמגיב לשינויים במצב האימות. אל תציבו את authStateChanges().listen(...) ישירות בתוך שיטת הבנייה של הווידג'ט, כי היא תיצור מינוי חדש בכל בנייה מחדש. אם אתם צריכים לעדכן את ממשק המשתמש בתגובה למצב האימות, אתם יכולים להשתמש ב-StreamBuilder:

    StreamBuilder<User?>(
    stream: FirebaseAuth.instance.authStateChanges(),
    builder: (BuildContext context, AsyncSnapshot<User?> snapshot) {
      if (snapshot.hasError) {
        return const Text('Something went wrong');
      }
    
      if (snapshot.connectionState == ConnectionState.waiting) {
        return const Text("Loading...");
      }
    
      if (!snapshot.hasData) {
        return const SignInScreen();
      }
    
      final user = snapshot.data!;
      return HomeScreen(userId: user.uid);
    },
    )
    

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

  • אובייקט UserCredential שמוחזר על ידי שיטות האימות (signIn-): לאובייקט UserCredential יש מאפיין user עם הערך הנוכחי של User:

    final userCredential =
        await FirebaseAuth.instance.signInWithCredential(credential);
    final user = userCredential.user;
    print(user?.uid);
    
  • המאפיין currentUser של מופע FirebaseAuth: אם אתם בטוחים שהמשתמש מחובר כרגע, אתם יכולים לגשת אל User מהמאפיין currentUser:

    if (FirebaseAuth.instance.currentUser != null) {
      print(FirebaseAuth.instance.currentUser?.uid);
    }
    

    יכולות להיות שתי סיבות לכך שהערך של currentUser הוא null:

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

קבלת פרטים מפרופיל משתמש ספציפי אצל ספק

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

if (user != null) {
    for (final providerProfile in user.providerData) {
        // ID of the provider (google.com, apple.com, etc.)
        final provider = providerProfile.providerId;

        // UID specific to the provider
        final uid = providerProfile.uid;

        // Name, email address, and profile photo URL
        final name = providerProfile.displayName;
        final emailAddress = providerProfile.email;
        final profilePhoto = providerProfile.photoURL;
    }
}

עדכון הפרופיל של משתמש

אפשר לעדכן את פרטי הפרופיל הבסיסיים של המשתמש – השם המוצג של המשתמש וכתובת ה-URL של תמונת הפרופיל – באמצעות השיטות update. לדוגמה:

await user?.updateDisplayName("Jane Q. User");
await user?.updatePhotoURL("https://example.com/jane-q-user/profile.jpg");

הגדרת כתובת אימייל של משתמש

אפשר להגדיר את כתובת האימייל של המשתמש באמצעות השיטה updateEmail(). לדוגמה:

await user?.updateEmail("janeq@example.com");

שליחת הודעת אימות למשתמש

אפשר לשלוח אימייל לאימות כתובת למשתמש באמצעות השיטה sendEmailVerification(). לדוגמה:

await user?.sendEmailVerification();

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

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

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

await FirebaseAuth.instance.setLanguageCode("fr");
await user?.sendEmailVerification();

הגדרת סיסמה למשתמש

אפשר להגדיר סיסמה של משתמש באמצעות השיטה updatePassword(). לדוגמה:

await user?.updatePassword(newPassword);

שליחת אימייל לאיפוס הסיסמה

אפשר לשלוח אימייל לאיפוס סיסמה למשתמש באמצעות השיטה sendPasswordResetEmail() לדוגמה:

await FirebaseAuth.instance
    .sendPasswordResetEmail(email: "user@example.com");

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

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

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

await FirebaseAuth.instance.setLanguageCode("fr");

אפשר גם לשלוח אימיילים לאיפוס סיסמה ממסוף Firebase.

מחיקת משתמש

אפשר למחוק חשבון משתמש באמצעות השיטה delete(). לדוגמה:

await user?.delete();

אפשר גם למחוק משתמשים מהקטע Authentication (אימות) במסוף Firebase, בדף Users (משתמשים).

אימות מחדש של משתמש

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

// Prompt the user to re-provide their sign-in credentials.
// Then, use the credentials to reauthenticate:
await user?.reauthenticateWithCredential(credential);

ייבוא חשבונות משתמשים

אפשר לייבא חשבונות משתמשים מקובץ לפרויקט Firebase באמצעות הפקודה auth:import של Firebase CLI. לדוגמה:

firebase auth:import users.json --hash-algo=scrypt --rounds=8 --mem-cost=14