אפשר להשתמש ב-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:33.7.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:23.1.0") }
- אם עדיין לא קישרתם את האפליקציה לפרויקט Firebase, תוכלו לעשות זאת דרך מסוף Firebase.
- אם עדיין לא הגדרתם את גיבוב ה-SHA-1 של האפליקציה במסוף Firebase, עליכם לעשות זאת. במאמר אימות הלקוח מוסבר איך למצוא את גיבוב ה-SHA-1 של האפליקציה.
חששות אבטחה
אימות באמצעות מספר טלפון בלבד הוא נוח, אבל פחות מאובטח מהשיטות האחרות הזמינות, כי אפשר להעביר בקלות את הבעלות על מספר טלפון בין משתמשים. בנוסף, במכשירים עם כמה פרופילים של משתמשים, כל משתמש שיכול לקבל הודעות SMS יכול להיכנס לחשבון באמצעות מספר הטלפון של המכשיר.
אם אתם משתמשים בכניסה שמבוססת על מספר טלפון באפליקציה, כדאי להציע אותה לצד שיטות כניסה מאובטחות יותר, ולהודיע למשתמשים על הפשרות האבטחה הכרוכות בכניסה באמצעות מספר טלפון.
הפעלת הכניסה באמצעות מספר טלפון בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות SMS, קודם צריך להפעיל את שיטת הכניסה באמצעות מספר טלפון בפרויקט Firebase:
- במסוף Firebase, פותחים את הקטע Authentication.
- בדף Sign-in Method מפעילים את שיטת הכניסה Phone Number.
הפעלת אימות האפליקציה
כדי להשתמש באימות מספר טלפון, ל-Firebase צריכה להיות אפשרות לאמת שבקשות כניסה באמצעות מספר טלפון מגיעות מהאפליקציה שלכם. יש שלוש דרכים שבהן Firebase Authentication מבצע את האימות:
- Play Integrity API: אם למשתמש יש מכשיר שבו מותקנת Google Play services, ו-Firebase Authentication יכול לאמת שהמכשיר תקין באמצעות Play Integrity API, אפשר להמשיך בתהליך הכניסה באמצעות מספר הטלפון. Firebase Authentication מפעיל את Play Integrity API בפרויקט בבעלות Google, ולא בפרויקט שלכם. הפעולה הזו לא תיכלל במכסות של 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 שקודמות ל-21.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
היא פוליגונציונית: אם קוראים לה כמה פעמים, למשל בשיטה onStart
של פעילות, השיטה verifyPhoneNumber
לא תשלח הודעת SMS שנייה אלא אם פג התוקף של הבקשה המקורית.
תוכלו להשתמש בהתנהגות הזו כדי להמשיך בתהליך הכניסה באמצעות מספר הטלפון אם האפליקציה נסגרת לפני שהמשתמש יכול להיכנס (לדוגמה, בזמן שהמשתמש משתמש באפליקציית ה-SMS). אחרי שמפעילים את verifyPhoneNumber
, מגדירים דגל שמציין שהאימות מתבצע. לאחר מכן, שומרים את הדגל בשיטה onSaveInstanceState
של הפעילות ומשחזרים את הדגל בשיטה onRestoreInstanceState
. לבסוף, בשיטה onStart
של הפעילות, בודקים אם האימות כבר מתבצע. אם כן, צריך לבצע קריאה חוזרת ל-verifyPhoneNumber
. חשוב לנקות את הדגל כשהאימות מסתיים או נכשל (ראו
קריאות חזרה (callbacks) של אימות).
כדי לטפל בקלות בסיבוב המסך ובמקרים אחרים של הפעלה מחדש של הפעילות, מעבירים את הפעילות ל-method verifyPhoneNumber
. פונקציות ה-callback ינותק באופן אוטומטי כשהפעילות תיפסק, כך שתוכלו לכתוב קוד של מעבר בממשק המשתמש בשיטות ה-callback ללא הגבלה.
אפשר גם להתאים את הודעת ה-SMS שנשלחת על ידי Firebase לשפה המקומית. לשם כך, מציינים את שפת האימות באמצעות השיטה setLanguageCode
במכונה של Auth.
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; } };
קריאות חוזרות לאימות
ברוב האפליקציות, מטמיעים את הפונקציות החוזרות (callbacks) onVerificationCompleted
, onVerificationFailed
ו-onCodeSent
. אפשר גם להטמיע את onCodeAutoRetrievalTimeOut
, בהתאם לדרישות של האפליקציה.
onVerificationCompleted(PhoneAuthCredential)
ה-method הזה נקרא בשתי סיטואציות:
- אימות מיידי: במקרים מסוימים אפשר לאמת את מספר הטלפון באופן מיידי בלי לשלוח או להזין קוד אימות.
- אחזור אוטומטי: במכשירים מסוימים, שירותי Google Play יכולים לזהות באופן אוטומטי את הודעת ה-SMS לאימות ולבצע את האימות בלי שהמשתמש יבצע פעולה כלשהי. (יכול להיות שהתכונה הזו לא זמינה אצל ספקים מסוימים). לשם כך נעשה שימוש ב-SMS Retriever API, שכולל גיבוב של 11 תווים בסוף הודעת ה-SMS.
PhoneAuthCredential
שמוענק ל-callback כדי להיכנס באמצעות המשתמש.
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, פותחים את הקטע Authentication.
- בכרטיסייה Sign in method (שיטת כניסה), מפעילים את ספק הטלפון, אם עדיין לא עשיתם זאת.
- פותחים את התפריט הנפתח מספרי טלפון לבדיקה.
- מציינים את מספר הטלפון שרוצים לבדוק, לדוגמה: +1 650-555-3434.
- מציינים את קוד האימות בן 6 הספרות של המספר הספציפי הזה, לדוגמה: 654321.
- מוסיפים את המספר. אם צריך, אפשר למחוק את מספר הטלפון ואת הקוד שלו על ידי העברת העכבר מעל השורה המתאימה ולחיצה על סמל האשפה.
בדיקה ידנית
אתם יכולים להתחיל להשתמש במספר טלפון בדיוני באפליקציה שלכם באופן ישיר. כך תוכלו לבצע בדיקות ידניות בשלבים השונים של הפיתוח בלי להיתקל בבעיות הקשורות למכסות או לבלימת תעבורה. אפשר גם לבדוק ישירות מסימולטור 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
עם מספר בדיוני תפעיל את האפשרות להתקשרות חזרה למספר 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();