אתם יכולים להשתמש ב-Firebase Authentication כדי להכניס משתמש לחשבון על ידי שליחת הודעת SMS לטלפון שלו. המשתמש נכנס לחשבון באמצעות קוד חד-פעמי שמופיע בהודעת ה-SMS.
הדרך הכי קלה להוסיף לאפליקציה כניסה באמצעות מספר טלפון היא באמצעות FirebaseUI, שכולל ווידג'ט כניסה שאפשר להוסיף בקלות ומיישם תהליכי כניסה באמצעות מספר טלפון, וגם כניסה באמצעות סיסמה וכניסה מאוחדת. במאמר הזה מוסבר איך להטמיע תהליך כניסה באמצעות מספר טלפון באמצעות Firebase SDK.
לפני שמתחילים
- אם עדיין לא עשיתם זאת, מוסיפים את Firebase לפרויקט Android.
-
בקובץ 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") }
- אם עדיין לא קישרתם את האפליקציה לפרויקט Firebase, אתם יכולים לעשות זאת דרך מסוף Firebase.
- אם עדיין לא הגדרתם את הגיבוב SHA-1 של האפליקציה במסוף Firebase, עליכם לעשות זאת. במאמר אימות הלקוח מוסבר איך למצוא את הגיבוב SHA-1 של האפליקציה.
חששות לגבי אבטחה
אימות באמצעות מספר טלפון בלבד הוא נוח, אבל הוא פחות מאובטח מהשיטות האחרות שזמינות, כי אפשר להעביר בקלות את הבעלות על מספר טלפון בין משתמשים. בנוסף, במכשירים עם כמה פרופילי משתמשים, כל משתמש שיכול לקבל הודעות SMS יכול להיכנס לחשבון באמצעות מספר הטלפון של המכשיר.
אם אתם משתמשים באפליקציה שלכם בכניסה שמבוססת על מספר טלפון, אתם צריכים להציע אותה לצד שיטות כניסה מאובטחות יותר, וליידע את המשתמשים לגבי הפשרות בנושא אבטחה שקשורות לשימוש בכניסה שמבוססת על מספר טלפון.
הפעלת כניסה באמצעות מספר טלפון בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות SMS, קודם צריך להפעיל את שיטת הכניסה באמצעות מספר טלפון בפרויקט Firebase:
- במסוף Firebase, פותחים את הקטע אימות.
- בדף שיטת הכניסה, מפעילים את שיטת הכניסה באמצעות מספר טלפון.
הפעלת אימות אפליקציות
כדי להשתמש באימות באמצעות מספר טלפון, מערכת 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
.
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.
- לכתוב בדיקות שילוב בלי להיחסם על ידי בדיקות אבטחה שבדרך כלל מופעלות על מספרי טלפון אמיתיים בסביבת ייצור.
מספרי טלפון פיקטיביים צריכים לעמוד בדרישות הבאות:
- חשוב לוודא שאתם משתמשים במספרי טלפון שהם באמת פיקטיביים ולא קיימים. Firebase Authentication לא מאפשר להגדיר מספרי טלפון קיימים שמשמשים משתמשים אמיתיים כמספרי בדיקה. אפשרות אחת היא להשתמש במספרים עם הקידומת 555 כמספרי טלפון לבדיקה בארה"ב, לדוגמה: +1 650-555-3434
- מספרי הטלפון צריכים להיות בפורמט הנכון מבחינת האורך ומגבלות אחרות. המספרים האלה עדיין יעברו את אותו תהליך אימות כמו מספר טלפון של משתמש אמיתי.
- אפשר להוסיף עד 10 מספרי טלפון לפיתוח.
- מומלץ להשתמש במספרי טלפון או בקודים לבדיקה שקשה לנחש ולשנות אותם בתדירות גבוהה.
יצירת מספרי טלפון וקודי אימות פיקטיביים
- במסוף Firebase, פותחים את הקטע אימות.
- בכרטיסייה שיטת הכניסה, מפעילים את ספק הטלפון אם עדיין לא עשיתם זאת.
- פותחים את התפריט הנפתח מספרי טלפון לבדיקה.
- מזינים את מספר הטלפון שרוצים לבדוק, לדוגמה: +1 650-555-3434.
- מזינים את קוד האימות בן 6 הספרות שקיבלתם למספר הספציפי הזה, לדוגמה: 654321.
- מוסיפים את המספר. אם צריך, אפשר למחוק את מספר הטלפון ואת הקוד שלו. כדי לעשות זאת, מעבירים את העכבר מעל השורה המתאימה ולוחצים על סמל האשפה.
בדיקה ידנית
אתם יכולים להתחיל להשתמש במספר טלפון פיקטיבי באפליקציה שלכם באופן ישיר. כך תוכלו לבצע בדיקות ידניות בשלבי הפיתוח בלי להיתקל בבעיות שקשורות למכסת השימוש או להגבלת קצב הבקשות. אפשר גם לבצע בדיקה ישירות מסימולטור 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();