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

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

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

לפני שאתה מתחיל

  1. אם עדיין לא עשית זאת, הוסף את Firebase לפרויקט Android שלך .
  2. בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל <project>/<app-module>/build.gradle.kts או <project>/<app-module>/build.gradle ), הוסף את התלות עבור אימות Firebase ספרייה עבור אנדרואיד. אנו ממליצים להשתמש ב- Firebase Android BoM כדי לשלוט בגירסאות של הספרייה.
    dependencies {
        // Import the BoM for the Firebase platform
        implementation(platform("com.google.firebase:firebase-bom:32.7.4"))
    
        // 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:22.3.1")
    }
    
    מחפש מודול ספרייה ספציפי לקוטלין? החל מאוקטובר 2023 (Firebase BoM 32.5.0) , מפתחי Kotlin ו-Java יכולים להיות תלויים במודול הספרייה הראשי (לפרטים, עיין בשאלות הנפוצות לגבי יוזמה זו ).
  3. אם עדיין לא חיברת את האפליקציה שלך לפרויקט Firebase שלך, עשה זאת ממסוף Firebase .
  4. אם עדיין לא הגדרת את Hash SHA-1 של האפליקציה שלך במסוף Firebase , עשה זאת. ראה אימות הלקוח שלך למידע על מציאת ה-hash SHA-1 של האפליקציה שלך.

דאגות ביטחוניות

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

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

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

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

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

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

אפשר אימות אפליקציה

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

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

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

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

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

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

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

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

פתרון תקלות

  • שגיאת "מצב התחלתי חסר" בעת שימוש ב-reCAPTCHA לאימות אפליקציה

    זה יכול להתרחש כאשר זרימת reCAPTCHA מסתיימת בהצלחה אך אינה מפנה את המשתמש בחזרה לאפליקציה המקורית. אם זה מתרחש, המשתמש מנותב לכתובת ה-Footback 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.

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

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 , המכיל יישומים של פונקציות ה-callback המטפלות בתוצאות הבקשה. לדוגמה:

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

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

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

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

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

בדיקה ידנית

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

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

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

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

כדי להפעיל ידנית את זרימת reCAPTCHA לבדיקה, השתמש בשיטת forceRecaptchaFlowForTesting() ‎.

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

בדיקת אינטגרציה

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

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

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

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

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)

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

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

כדי לצאת ממשתמש, התקשר ל- signOut :

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();