אימות עם Firebase באמצעות חשבונות מבוססי סיסמה ב-Android

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

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

  1. אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט Android.

  2. אם עדיין לא קישרתם את האפליקציה לפרויקט Firebase, תוכלו לעשות זאת דרך מסוף Firebase.
  3. מפעילים כניסה לחשבון באמצעות כתובת אימייל או סיסמה:
    1. במסוף Firebase, פותחים את הקטע Auth.
    2. בכרטיסייה Sign in method, מפעילים את שיטת הכניסה Email/password ולוחצים על Save.
  4. בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל <project>/<app-module>/build.gradle.kts או <project>/<app-module>/build.gradle), מוסיפים את התלות בספרייה Firebase Authentication ל-Android. מומלץ להשתמש ב-Firebase Android BoM כדי לשלוט בגרסאות הספרייה.

    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:33.5.1"))
    
        // Add the dependency for the Firebase Authentication library
        // When using the BoM, you don't specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth")
    }

    אם תשתמשו ב-Firebase Android BoM, האפליקציה תמיד תשתמש בגרסאות תואמות של ספריות Android של Firebase.

    (חלופה) מוסיפים יחסי תלות של ספריית Firebase בלי להשתמש ב-BoM

    אם בוחרים לא להשתמש ב-Firebase BoM, צריך לציין את כל הגרסאות של ספריות Firebase בשורת התלות שלהן.

    שימו לב: אם אתם משתמשים במספר ספריות של Firebase באפליקציה, מומלץ מאוד להשתמש ב-BoM כדי לנהל את הגרסאות של הספריות, וכך לוודא שכל הגרסאות תואמות.

    dependencies {
        // Add the dependency for the Firebase Authentication library
        // When NOT using the BoM, you must specify versions in Firebase library dependencies
        implementation("com.google.firebase:firebase-auth:23.1.0")
    }
    מחפשים מודול ספרייה ספציפי ל-Kotlin? החל מ-אוקטובר 2023 (Firebase BoM 32.5.0), מפתחי Kotlin ומפתחי Java יוכלו להסתמך על מודול הספרייה הראשי (פרטים נוספים זמינים בשאלות הנפוצות לגבי היוזמה הזו).

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

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

  1. ב-method‏ onCreate של פעילות ההרשמה, מקבלים את המופע המשותף של האובייקט FirebaseAuth:

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. כשאתם מאתחלים את הפעילות, בודקים אם המשתמש מחובר כרגע:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. כשמשתמש חדש נרשם באמצעות טופס ההרשמה של האפליקציה, צריך להשלים את השלבים החדשים לאימות החשבון שנדרשים לאפליקציה, למשל כדי לוודא שהסיסמה של החשבון החדש הוקלדה בצורה נכונה ועומדת בדרישות המורכבות שלך.
  4. כדי ליצור חשבון חדש, מעבירים את כתובת האימייל והסיסמה של המשתמש החדש אל createUserWithEmailAndPassword:

    Kotlin+KTX

    auth.createUserWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "createUserWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "createUserWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.createUserWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "createUserWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "createUserWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    אם החשבון החדש נוצר, המשתמש נכנס גם הוא לחשבון. בקריאה החוזרת (callback), אפשר להשתמש בשיטה getCurrentUser כדי לקבל את נתוני החשבון של המשתמש.

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

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

  1. ב-method onCreate של פעילות הכניסה, מקבלים את המופע המשותף של האובייקט FirebaseAuth:

    Kotlin+KTX

    private lateinit var auth: FirebaseAuth
    // ...
    // Initialize Firebase Auth
    auth = Firebase.auth

    Java

    private FirebaseAuth mAuth;
    // ...
    // Initialize Firebase Auth
    mAuth = FirebaseAuth.getInstance();
  2. כשאתם מאתחלים את הפעילות, בודקים אם המשתמש מחובר כרגע:

    Kotlin+KTX

    public override fun onStart() {
        super.onStart()
        // Check if user is signed in (non-null) and update UI accordingly.
        val currentUser = auth.currentUser
        if (currentUser != null) {
            reload()
        }
    }

    Java

    @Override
    public void onStart() {
        super.onStart();
        // Check if user is signed in (non-null) and update UI accordingly.
        FirebaseUser currentUser = mAuth.getCurrentUser();
        if(currentUser != null){
            reload();
        }
    }
  3. כשמשתמש נכנס לאפליקציה, מעבירים את כתובת האימייל והסיסמה שלו אל signInWithEmailAndPassword:

    Kotlin+KTX

    auth.signInWithEmailAndPassword(email, password)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithEmail:success")
                val user = auth.currentUser
                updateUI(user)
            } else {
                // If sign in fails, display a message to the user.
                Log.w(TAG, "signInWithEmail:failure", task.exception)
                Toast.makeText(
                    baseContext,
                    "Authentication failed.",
                    Toast.LENGTH_SHORT,
                ).show()
                updateUI(null)
            }
        }

    Java

    mAuth.signInWithEmailAndPassword(email, password)
            .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                @Override
                public void onComplete(@NonNull Task<AuthResult> task) {
                    if (task.isSuccessful()) {
                        // Sign in success, update UI with the signed-in user's information
                        Log.d(TAG, "signInWithEmail:success");
                        FirebaseUser user = mAuth.getCurrentUser();
                        updateUI(user);
                    } else {
                        // If sign in fails, display a message to the user.
                        Log.w(TAG, "signInWithEmail:failure", task.getException());
                        Toast.makeText(EmailPasswordActivity.this, "Authentication failed.",
                                Toast.LENGTH_SHORT).show();
                        updateUI(null);
                    }
                }
            });
    אם הכניסה בוצעה בהצלחה, אפשר להשתמש ב-FirebaseUser שהוחזר כדי להמשיך.

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

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

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

הגדרות אימות

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

  • יש להזין תו באות קטנה

  • צריך להזין תו גדול

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

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

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

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

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

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

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

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

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

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

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

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

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

השלבים הבאים

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

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

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

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

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

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();