אימות עם Firebase ב-Android באמצעות מספר טלפון

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

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

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

  1. אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט Android.
  2. בקובץ 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:34.0.0"))
    
        // 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, האפליקציה תמיד תשתמש בגרסאות תואמות של ספריות Firebase ל-Android.

    (חלופה)  מוסיפים תלויות של ספריות 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:24.0.0")
    }
  3. אם עדיין לא קישרתם את האפליקציה לפרויקט Firebase, אתם יכולים לעשות זאת דרך מסוף Firebase.
  4. אם עדיין לא הגדרתם את הגיבוב SHA-1 של האפליקציה במסוף Firebase, עליכם לעשות זאת. במאמר אימות הלקוח מוסבר איך למצוא את הגיבוב SHA-1 של האפליקציה.

חששות לגבי אבטחה

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

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

הפעלת כניסה באמצעות מספר טלפון בפרויקט Firebase

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

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

הפעלת אימות אפליקציות

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

  • Play Integrity API: אם למשתמש יש מכשיר שמותקנת בו Google Play services,‏ ו-Firebase Authentication יכול לאמת את המכשיר כלגיטימי באמצעות Play Integrity API, תהליך הכניסה באמצעות מספר הטלפון יכול להימשך. ‫Play Integrity API מופעל בפרויקט בבעלות Google על ידי Firebase Authentication, ולא בפרויקט שלכם. השימוש הזה לא נספר במכסות של Play Integrity API בפרויקט. תמיכה ב-Play Integrity זמינה ב-Authentication SDK v21.2.0 ומעלה (Firebase BoM v31.4.0 ומעלה).

    כדי להשתמש ב-Play Integrity, אם עדיין לא ציינתם את טביעת האצבע של האפליקציה בפורמט SHA-256, אתם צריכים לעשות זאת דרך הגדרות הפרויקט במסוף Firebase. פרטים על האופן שבו מקבלים את טביעת האצבע של האפליקציה בפורמט SHA-256 מופיעים במאמר בנושא אימות הלקוח.

  • אימות reCAPTCHA: אם אי אפשר להשתמש ב-Play Integrity, למשל אם למשתמש יש מכשיר שלא מותקן בו Google Play services, Firebase Authenticationהוא יכול להשתמש באימות reCAPTCHA כדי להשלים את תהליך הכניסה לטלפון. לעתים קרובות אפשר להשלים את אתגר ה-reCAPTCHA בלי שהמשתמש יצטרך לפתור משהו. הערה: כדי להשתמש בתהליך הזה, צריך לוודא ש-SHA-1 משויך לאפליקציה. בנוסף, כדי להשתמש בתהליך הזה, מפתח ה-API שלכם צריך להיות ללא הגבלות או להיכלל ברשימת ההיתרים של PROJECT_ID.firebaseapp.com.

    תרחישים שבהם מופעלת מערכת reCAPTCHA:

    • אם אפליקציית Google Play services לא מותקנת במכשיר של משתמש הקצה.
    • אם האפליקציה לא מופצת דרך Google Play Store (ב-Authentication SDK v21.2.0 ואילך).
    • אם טוקן SafetyNet שהתקבל לא היה תקין (בגרסאות SDK‏ Authentication < v21.2.0).

    כשמשתמשים ב-SafetyNet או ב-Play Integrity לאימות אפליקציות, השדה %APP_NAME% בתבנית ה-SMS מאוכלס בשם האפליקציה שנקבע מתוך Google Play Store. בתרחישים שבהם מופעל reCAPTCHA, הערך %APP_NAME% מאוכלס כ-PROJECT_ID.firebaseapp.com.

אפשר להפעיל בכוח את תהליך האימות של reCAPTCHA באמצעות forceRecaptchaFlowForTesting אפשר להשבית את אימות האפליקציה (כשמשתמשים במספרי טלפון פיקטיביים) באמצעות setAppVerificationDisabledForTesting.

פתרון בעיות

  • השגיאה 'חסר מצב התחלתי' כשמשתמשים ב-reCAPTCHA לאימות אפליקציות

    מצב כזה יכול לקרות כשתהליך reCAPTCHA מסתיים בהצלחה, אבל המשתמש לא מופנה חזרה לאפליקציה המקורית. במקרה כזה, המשתמש מופנה לכתובת ה-URL של הגיבוי PROJECT_ID.firebaseapp.com/__/auth/handler. בדפדפני Firefox, פתיחת קישורים לאפליקציות מקוריות מושבתת כברירת מחדל. אם אתם רואים את השגיאה שלמעלה ב-Firefox, צריך לפעול לפי השלבים במאמר הגדרת Firefox ל-Android לפתיחת קישורים באפליקציות מקוריות כדי להפעיל פתיחה של קישורים לאפליקציות.

שליחת קוד אימות לטלפון של המשתמש

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

לאחר מכן, מעבירים את מספר הטלפון שלהם לשיטה PhoneAuthProvider.verifyPhoneNumber כדי לבקש מ-Firebase לאמת את מספר הטלפון של המשתמש. לדוגמה:

Kotlin

val options = PhoneAuthOptions.newBuilder(auth)
    .setPhoneNumber(phoneNumber) // Phone number to verify
    .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
    .setActivity(this) // Activity (for callback binding)
    .setCallbacks(callbacks) // OnVerificationStateChangedCallbacks
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

Java

PhoneAuthOptions options = 
  PhoneAuthOptions.newBuilder(mAuth) 
      .setPhoneNumber(phoneNumber)       // Phone number to verify
      .setTimeout(60L, TimeUnit.SECONDS) // Timeout and unit
      .setActivity(this)                 // (optional) Activity for callback binding
      // If no activity is passed, reCAPTCHA verification can not be used.
      .setCallbacks(mCallbacks)          // OnVerificationStateChangedCallbacks
      .build();
  PhoneAuthProvider.verifyPhoneNumber(options);     

השיטה verifyPhoneNumber היא reentrant: אם קוראים לה מספר פעמים, למשל בשיטה onStart של פעילות, השיטה verifyPhoneNumber לא תשלח הודעת SMS שנייה אלא אם פג הזמן הקצוב לתפוגה של הבקשה המקורית.

אתם יכולים להשתמש בהתנהגות הזו כדי להמשיך את תהליך הכניסה באמצעות מספר הטלפון אם האפליקציה נסגרת לפני שהמשתמש יכול להיכנס (לדוגמה, בזמן שהמשתמש משתמש באפליקציית ה-SMS). אחרי שמתקשרים למספר verifyPhoneNumber, מגדירים סימן שמציין שהאימות מתבצע. לאחר מכן, שומרים את הדגל בשיטה onSaveInstanceState של הפעילות ומשחזרים את הדגל ב-onRestoreInstanceState. לבסוף, בשיטה onStart של הפעילות, בודקים אם האימות כבר מתבצע, ואם כן, קוראים שוב ל-verifyPhoneNumber. חשוב להסיר את הסימון כשהאימות מסתיים בהצלחה או נכשל (ראו קריאות חוזרות לאימות).

כדי לטפל בקלות בסיבוב המסך ובמקרים אחרים של הפעלה מחדש של Activity, מעבירים את ה-Activity לשיטה verifyPhoneNumber. ה-callbacks ינותקו אוטומטית כשהפעילות תסתיים, כך שתוכלו לכתוב באופן חופשי קוד מעבר בממשק המשתמש בשיטות ה-callback.

אפשר גם להתאים את הודעת ה-SMS שנשלחת על ידי Firebase לשפה המקומית על ידי ציון שפת האימות באמצעות השיטה setLanguageCode במופע האימות.

Kotlin

auth.setLanguageCode("fr")
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage()

Java

auth.setLanguageCode("fr");
// To apply the default app language instead of explicitly setting it.
// auth.useAppLanguage();

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

Kotlin

callbacks = object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    override fun onVerificationCompleted(credential: PhoneAuthCredential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:$credential")
        signInWithPhoneAuthCredential(credential)
    }

    override fun onVerificationFailed(e: FirebaseException) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e)

        if (e is FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e is FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e is FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    override fun onCodeSent(
        verificationId: String,
        token: PhoneAuthProvider.ForceResendingToken,
    ) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:$verificationId")

        // Save verification ID and resending token so we can use them later
        storedVerificationId = verificationId
        resendToken = token
    }
}

Java

mCallbacks = new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

    @Override
    public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
        // This callback will be invoked in two situations:
        // 1 - Instant verification. In some cases the phone number can be instantly
        //     verified without needing to send or enter a verification code.
        // 2 - Auto-retrieval. On some devices Google Play services can automatically
        //     detect the incoming verification SMS and perform verification without
        //     user action.
        Log.d(TAG, "onVerificationCompleted:" + credential);

        signInWithPhoneAuthCredential(credential);
    }

    @Override
    public void onVerificationFailed(@NonNull FirebaseException e) {
        // This callback is invoked in an invalid request for verification is made,
        // for instance if the the phone number format is not valid.
        Log.w(TAG, "onVerificationFailed", e);

        if (e instanceof FirebaseAuthInvalidCredentialsException) {
            // Invalid request
        } else if (e instanceof FirebaseTooManyRequestsException) {
            // The SMS quota for the project has been exceeded
        } else if (e instanceof FirebaseAuthMissingActivityForRecaptchaException) {
            // reCAPTCHA verification attempted with null Activity
        }

        // Show a message and update the UI
    }

    @Override
    public void onCodeSent(@NonNull String verificationId,
                           @NonNull PhoneAuthProvider.ForceResendingToken token) {
        // The SMS verification code has been sent to the provided phone number, we
        // now need to ask the user to enter the code and then construct a credential
        // by combining the code with a verification ID.
        Log.d(TAG, "onCodeSent:" + verificationId);

        // Save verification ID and resending token so we can use them later
        mVerificationId = verificationId;
        mResendToken = token;
    }
};

התקשרות חוזרת לאימות

ברוב האפליקציות, מטמיעים את הקריאות החוזרות (callback) onVerificationCompleted, onVerificationFailed ו-onCodeSent. יכול להיות שתצטרכו להטמיע גם את onCodeAutoRetrievalTimeOut, בהתאם לדרישות של האפליקציה.

onVerificationCompleted(PhoneAuthCredential)

ה-method הזה נקרא בשני מצבים:

  • אימות מיידי: במקרים מסוימים אפשר לאמת את מספר הטלפון באופן מיידי בלי לשלוח או להזין קוד אימות.
  • אחזור אוטומטי: במכשירים מסוימים, שירותי Google Play יכולים לזהות באופן אוטומטי את הודעת ה-SMS הנכנסת לאימות ולבצע את האימות בלי שהמשתמש יצטרך לעשות כלום. (יכול להיות שהיכולת הזו לא זמינה אצל ספקים מסוימים). האימות מתבצע באמצעות SMS Retriever API, שכולל גיבוב (hash) של 11 תווים בסוף הודעת ה-SMS.
בכל מקרה, מספר הטלפון של המשתמש אומת בהצלחה, ואפשר להשתמש באובייקט PhoneAuthCredential שמועבר לקריאה החוזרת כדי להחתים את המשתמש.

onVerificationFailed(FirebaseException)

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

onCodeSent(String verificationId, PhoneAuthProvider.ForceResendingToken)

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

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

onCodeAutoRetrievalTimeOut(String verificationId)

זה שינוי אופציונלי. המערכת קוראת לשיטה הזו אחרי שחלף משך הזמן הקצוב לתפוגה שצוין ל-verifyPhoneNumber בלי ש-onVerificationCompleted הופעל קודם. במכשירים ללא כרטיסי SIM, השיטה הזו מופעלת באופן מיידי כי אי אפשר לאחזר אוטומטית הודעות SMS.

חלק מהאפליקציות חוסמות את קלט המשתמש עד שתקופת האימות האוטומטי מסתיימת, ורק אז מציגות ממשק משתמש שמבקש מהמשתמש להקליד את קוד האימות מהודעת ה-SMS (לא מומלץ).

יצירת אובייקט PhoneAuthCredential

אחרי שהמשתמש מזין את קוד האימות ש-Firebase שלחה לטלפון שלו, יוצרים אובייקט PhoneAuthCredential באמצעות קוד האימות ומזהה האימות שהועבר אל הקריאה החוזרת (callback) של onCodeSent או onCodeAutoRetrievalTimeOut. (כשקוראים לפונקציה onVerificationCompleted, מקבלים ישירות אובייקט PhoneAuthCredential, כך שאפשר לדלג על השלב הזה).

כדי ליצור את האובייקט PhoneAuthCredential, קוראים ל-PhoneAuthProvider.getCredential:

Kotlin

val credential = PhoneAuthProvider.getCredential(verificationId!!, code)

Java

PhoneAuthCredential credential = PhoneAuthProvider.getCredential(verificationId, code);

כניסה של המשתמש

אחרי שמקבלים אובייקט PhoneAuthCredential, בין אם בקריאה החוזרת onVerificationCompleted או בקריאה ל-PhoneAuthProvider.getCredential, משלימים את תהליך הכניסה על ידי העברת האובייקט PhoneAuthCredential אל FirebaseAuth.signInWithCredential:

Kotlin

private fun signInWithPhoneAuthCredential(credential: PhoneAuthCredential) {
    auth.signInWithCredential(credential)
        .addOnCompleteListener(this) { task ->
            if (task.isSuccessful) {
                // Sign in success, update UI with the signed-in user's information
                Log.d(TAG, "signInWithCredential:success")

                val user = task.result?.user
            } else {
                // Sign in failed, display a message and update the UI
                Log.w(TAG, "signInWithCredential:failure", task.exception)
                if (task.exception is FirebaseAuthInvalidCredentialsException) {
                    // The verification code entered was invalid
                }
                // Update UI
            }
        }
}

Java

private void signInWithPhoneAuthCredential(PhoneAuthCredential credential) {
    mAuth.signInWithCredential(credential)
            .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, "signInWithCredential:success");

                        FirebaseUser user = task.getResult().getUser();
                        // Update UI
                    } else {
                        // Sign in failed, display a message and update the UI
                        Log.w(TAG, "signInWithCredential:failure", task.getException());
                        if (task.getException() instanceof FirebaseAuthInvalidCredentialsException) {
                            // The verification code entered was invalid
                        }
                    }
                }
            });
}

בדיקה באמצעות מספרי טלפון פיקטיביים

אפשר להגדיר מספרי טלפון פיקטיביים לפיתוח דרך מסוף Firebase. הבדיקה באמצעות מספרי טלפון פיקטיביים מספקת את היתרונות הבאים:

  • בודקים את אימות מספר הטלפון בלי לנצל את מכסת השימוש.
  • בודקים את אימות מספר הטלפון בלי לשלוח הודעת SMS בפועל.
  • להריץ בדיקות רצופות עם אותו מספר טלפון בלי שהמערכת תגביל את מספר הבדיקות. השיטה הזו מצמצמת את הסיכון לדחייה במהלך תהליך הבדיקה של חנות האפליקציות, אם הבודק משתמש באותו מספר טלפון לבדיקה.
  • אפשר לבצע בדיקות בקלות בסביבות פיתוח ללא מאמץ נוסף, למשל לפתח באמולטור iOS או באמולטור Android ללא Google Play Services.
  • לכתוב בדיקות שילוב בלי להיחסם על ידי בדיקות אבטחה שבדרך כלל מופעלות על מספרי טלפון אמיתיים בסביבת ייצור.

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

  1. חשוב לוודא שאתם משתמשים במספרי טלפון שהם באמת פיקטיביים ולא קיימים. Firebase Authentication לא מאפשר להגדיר מספרי טלפון קיימים שמשמשים משתמשים אמיתיים כמספרי בדיקה. אפשרות אחת היא להשתמש במספרים עם הקידומת 555 כמספרי טלפון לבדיקה בארה"ב, לדוגמה: ‎+1 650-555-3434
  2. מספרי הטלפון צריכים להיות בפורמט הנכון מבחינת האורך ומגבלות אחרות. המספרים האלה עדיין יעברו את אותו תהליך אימות כמו מספר טלפון של משתמש אמיתי.
  3. אפשר להוסיף עד 10 מספרי טלפון לפיתוח.
  4. מומלץ להשתמש במספרי טלפון או בקודים לבדיקה שקשה לנחש ולשנות אותם בתדירות גבוהה.

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

  1. במסוף Firebase, פותחים את הקטע אימות.
  2. בכרטיסייה שיטת הכניסה, מפעילים את ספק הטלפון אם עדיין לא עשיתם זאת.
  3. פותחים את התפריט הנפתח מספרי טלפון לבדיקה.
  4. מזינים את מספר הטלפון שרוצים לבדוק, לדוגמה: +1 650-555-3434.
  5. מזינים את קוד האימות בן 6 הספרות שקיבלתם למספר הספציפי הזה, לדוגמה: 654321.
  6. מוסיפים את המספר. אם צריך, אפשר למחוק את מספר הטלפון ואת הקוד שלו. כדי לעשות זאת, מעבירים את העכבר מעל השורה המתאימה ולוחצים על סמל האשפה.

בדיקה ידנית

אתם יכולים להתחיל להשתמש במספר טלפון פיקטיבי באפליקציה שלכם באופן ישיר. כך תוכלו לבצע בדיקות ידניות בשלבי הפיתוח בלי להיתקל בבעיות שקשורות למכסת השימוש או להגבלת קצב הבקשות. אפשר גם לבצע בדיקה ישירות מסימולטור iOS או מאמולטור Android בלי להתקין את Google Play Services.

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

בסיום הכניסה, נוצר משתמש ב-Firebase עם מספר הטלפון הזה. המשתמש מתנהג כמו משתמש עם מספר טלפון אמיתי, ויש לו את אותן תכונות. הוא יכול לגשת אל Realtime Database/Cloud Firestore ואל שירותים אחרים באותו אופן. אסימון ה-ID שנוצר במהלך התהליך הזה כולל את אותה חתימה כמו של משתמש עם מספר טלפון אמיתי.

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

כדי להפעיל ידנית את תהליך ה-reCAPTCHA לצורך בדיקה, משתמשים בשיטה forceRecaptchaFlowForTesting().

// Force reCAPTCHA flow
FirebaseAuth.getInstance().getFirebaseAuthSettings().forceRecaptchaFlowForTesting();

בדיקות שילוב

בנוסף לבדיקות ידניות, Firebase Authentication מספקת ממשקי API שיעזרו לכם לכתוב בדיקות אינטגרציה לבדיקת אימות טלפוני. ממשקי ה-API האלה משביתים את אימות האפליקציה על ידי השבתת הדרישה של reCAPTCHA באינטרנט והתראות פוש שקטות ב-iOS. כך אפשר לבצע בדיקות אוטומטיות בתהליכים האלה וליישם אותן בקלות. בנוסף, הם עוזרים לספק את היכולת לבדוק תהליכי אימות מיידיים ב-Android.

ב-Android, מתקשרים אל setAppVerificationDisabledForTesting() לפני השיחה אל signInWithPhoneNumber. הפעולה הזו משביתה את אימות האפליקציה באופן אוטומטי, כך שתוכלו להעביר את מספר הטלפון בלי לפתור את האתגר באופן ידני. גם אם השבתתם את Play Integrity ואת reCAPTCHA, לא תוכלו להיכנס לחשבון אם תשתמשו במספר טלפון אמיתי. אפשר להשתמש ב-API הזה רק עם מספרי טלפון פיקטיביים.

// Turn off phone auth app verification.
FirebaseAuth.getInstance().getFirebaseAuthSettings()
   .setAppVerificationDisabledForTesting();

התקשרות למספר verifyPhoneNumber עם מספר פיקטיבי מפעילה את הקריאה החוזרת onCodeSent, שבה צריך לספק את קוד האימות המתאים. כך אפשר לבצע בדיקות באמולטורים של Android.

Java

String phoneNum = "+16505554567";
String testVerificationCode = "123456";

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
FirebaseAuth auth = FirebaseAuth.getInstance();
PhoneAuthOptions options = PhoneAuthOptions.newBuilder(auth)
        .setPhoneNumber(phoneNum)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onCodeSent(@NonNull String verificationId,
                                   @NonNull PhoneAuthProvider.ForceResendingToken forceResendingToken) {
                // Save the verification id somewhere
                // ...

                // The corresponding whitelisted code above should be used to complete sign-in.
                MainActivity.this.enableUserManuallyInputCode();
            }

            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential phoneAuthCredential) {
                // Sign in with the credential
                // ...
            }

            @Override
            public void onVerificationFailed(@NonNull FirebaseException e) {
                // ...
            }
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

val phoneNum = "+16505554567"
val testVerificationCode = "123456"

// Whenever verification is triggered with the whitelisted number,
// provided it is not set for auto-retrieval, onCodeSent will be triggered.
val options = PhoneAuthOptions.newBuilder(Firebase.auth)
    .setPhoneNumber(phoneNum)
    .setTimeout(30L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {

        override fun onCodeSent(
            verificationId: String,
            forceResendingToken: PhoneAuthProvider.ForceResendingToken,
        ) {
            // Save the verification id somewhere
            // ...

            // The corresponding whitelisted code above should be used to complete sign-in.
            this@MainActivity.enableUserManuallyInputCode()
        }

        override fun onVerificationCompleted(phoneAuthCredential: PhoneAuthCredential) {
            // Sign in with the credential
            // ...
        }

        override fun onVerificationFailed(e: FirebaseException) {
            // ...
        }
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

בנוסף, אפשר לבדוק תהליכי אחזור אוטומטי ב-Android על ידי הגדרת מספר פיקטיבי וקוד האימות התואם שלו לאחזור אוטומטי באמצעות קריאה ל-setAutoRetrievedSmsCodeForPhoneNumber.

כשקוראים ל-verifyPhoneNumber, הוא מפעיל את onVerificationCompleted עם PhoneAuthCredential ישירות. האפשרות הזו פועלת רק עם מספרי טלפון פיקטיביים.

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

Java

// The test phone number and code should be whitelisted in the console.
String phoneNumber = "+16505554567";
String smsCode = "123456";

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
FirebaseAuthSettings firebaseAuthSettings = firebaseAuth.getFirebaseAuthSettings();

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode);

PhoneAuthOptions options = PhoneAuthOptions.newBuilder(firebaseAuth)
        .setPhoneNumber(phoneNumber)
        .setTimeout(60L, TimeUnit.SECONDS)
        .setActivity(this)
        .setCallbacks(new PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
            @Override
            public void onVerificationCompleted(@NonNull PhoneAuthCredential credential) {
                // Instant verification is applied and a credential is directly returned.
                // ...
            }

            // ...
        })
        .build();
PhoneAuthProvider.verifyPhoneNumber(options);

Kotlin

// The test phone number and code should be whitelisted in the console.
val phoneNumber = "+16505554567"
val smsCode = "123456"

val firebaseAuth = Firebase.auth
val firebaseAuthSettings = firebaseAuth.firebaseAuthSettings

// Configure faking the auto-retrieval with the whitelisted numbers.
firebaseAuthSettings.setAutoRetrievedSmsCodeForPhoneNumber(phoneNumber, smsCode)

val options = PhoneAuthOptions.newBuilder(firebaseAuth)
    .setPhoneNumber(phoneNumber)
    .setTimeout(60L, TimeUnit.SECONDS)
    .setActivity(this)
    .setCallbacks(object : PhoneAuthProvider.OnVerificationStateChangedCallbacks() {
        override fun onVerificationCompleted(credential: PhoneAuthCredential) {
            // Instant verification is applied and a credential is directly returned.
            // ...
        }

        // ...
    })
    .build()
PhoneAuthProvider.verifyPhoneNumber(options)

השלבים הבאים

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

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

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

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

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

Kotlin

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();