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

בעיית אבטחה

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

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

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

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

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

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

כדי להשתמש באימות של מספר הטלפון, מערכת 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 מגרסה 21.2.0 ואילך (Firebase BoM גרסה 31.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 מגרסה 21.2.0 ואילך).
    • אם אסימון SafetyNet שהתקבל לא היה חוקי (ב-Authentication גרסאות SDK < גרסה 21.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+KTX

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 נוספת: אם קוראים לה כמה פעמים, למשל בשיטה onStart של פעילות, הפונקציה verifyPhoneNumber לא תשלח הודעת SMS שנייה, אלא אם פג הזמן הקצוב לבקשה המקורית.

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

כדי לטפל בקלות בסיבוב המסך ובמופעים אחרים של 'הפעילות מחדש', להעביר את הפעילות שלך לשיטה verifyPhoneNumber. הקריאות החוזרות (callback) ינותק באופן אוטומטי כשהפעילות תסתיים, כך שאפשר יהיה לכתוב בממשק המשתמש באופן חופשי את קוד המעבר בשיטות הקריאה החוזרת (callback).

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

Kotlin+KTX

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+KTX

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;
    }
};

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

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

onVerificationCompleted(PhoneAuthCredential)

השיטה הזו נקראת בשני מצבים:

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

onverificationנכשל(Firebase יוצא מן הכלל)

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

onCodeSent(String verificationId, PhoneAuthProvider.Force repeatedingToken)

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

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

onCodeAutoRetrievalTimeOut(String verificationId)

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

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

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

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

כדי ליצור את האובייקט PhoneAuthCredential, צריך להפעיל את PhoneAuthProvider.getCredential:

Kotlin+KTX

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

Java

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

כניסה לחשבון המשתמש

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

Kotlin+KTX

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 אמיתית.
  • הפעלת בדיקות ברצף עם אותו מספר טלפון בלי ויסות נתונים (throttle). הזה מפחית את הסיכון לדחייה במהלך הבדיקה בחנות האפליקציות, אם הבודק משתמש את אותו מספר טלפון לבדיקה.
  • לבצע בדיקה מהירה בסביבות פיתוח ללא מאמץ נוסף, כמו את היכולת לפתח סימולטור של iOS או אמולטור Android ללא Google Play Services.
  • כתיבת בדיקות שילוב מבלי להיחסם על ידי בדיקות אבטחה שבדרך כלל מיושמות מספרי טלפון אמיתיים בסביבת הייצור.

מספרי טלפון בדיוניים חייבים לעמוד בדרישות הבאות:

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

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

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

בדיקה ידנית

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

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

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

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

כדי להפעיל ידנית את תהליך 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 עם מספר בדיוני, מפעילה את קריאה חוזרת (callback) של 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+KTX

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+KTX

// 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+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();