אימות באמצעות טלפון מאפשר למשתמשים להיכנס ל-Firebase באמצעות הטלפון שלהם כמאמת. נשלחת למשתמש הודעת SMS (באמצעות מספר הטלפון שצוין) עם קוד ייחודי. אחרי שהקוד יאושר, המשתמש יוכל להיכנס ל-Firebase.
מספרי הטלפון שמשתמשי הקצה מספקים לצורך אימות יישלחו ויאוחסנו על ידי Google כדי לשפר את יכולת המניעה של ספאם והתנהלות פוגעת בשירותי Google, כולל Firebase, בין היתר. מפתחים צריכים לוודא שיש להם את הסכמת משתמשי הקצה המתאימה לפני שהם משתמשים בשירות הכניסה באמצעות מספר טלפון באימות ב-Firebase.
אימות הטלפון ב-Firebase לא נתמך בכל המדינות. מידע נוסף זמין בשאלות הנפוצות שלהם.
הגדרה
לפני שמתחילים להשתמש באימות באמצעות טלפון, חשוב לוודא שביצעתם את הפעולות הבאות:
- מפעילים את הטלפון כשיטת כניסה במסוף Firebase.
- Android: אם עדיין לא הגדרתם את גיבוב ה-SHA-1 של האפליקציה במסוף Firebase, עליכם לעשות זאת. תוכלו לקרוא את המאמר אימות הלקוח כדי לקבל מידע על איתור גיבוב ה-SHA-1 של האפליקציה.
- iOS: ב-Xcode, מפעילים את ההתראות ב-push בפרויקט ומוודאים שמפתח האימות של APNs מוגדר ב-Firebase Cloud Messaging (FCM). בנוסף, צריך להפעיל את המצבים ברקע כדי לקבל התראות מרחוק. הסבר מפורט על השלב הזה זמין במסמכי התיעוד של אימות הטלפון ב-Firebase ל-iOS.
- אינטרנט: מוודאים שהוספתם את הדומיין של האפליקציות במסוף Firebase, בקטע דומיינים להפניה אוטומטית של OAuth.
הערה: אפשר להיכנס לחשבון באמצעות מספר טלפון רק במכשירים אמיתיים ובאינטרנט. כדי לבדוק את תהליך האימות במהדמנים של מכשירים, קראו את המאמר בדיקה.
שימוש
ה-SDK של Firebase Authentication ל-Flutter מספק שתי דרכים נפרדות להכניס משתמש באמצעות מספר הטלפון שלו. בפלטפורמות מקוריות (למשל Android ו-iOS) יש פונקציונליות שונה לאימות מספר טלפון מאשר באינטרנט, ולכן יש שתי שיטות לכל פלטפורמה בנפרד:
- פלטפורמה מקורית:
verifyPhoneNumber
. - Web Platform:
signInWithPhoneNumber
.
מודעה מותאמת: verifyPhoneNumber
בפלטפורמות מקוריות, צריך לאמת קודם את מספר הטלפון של המשתמש ואז המשתמש יכול להיכנס לחשבון או לקשר אותו באמצעות PhoneAuthCredential
.
קודם צריך לבקש מהמשתמש להזין את מספר הטלפון שלו. לאחר מכן, צריך להפעיל את השיטה verifyPhoneNumber()
:
await FirebaseAuth.instance.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
verificationCompleted: (PhoneAuthCredential credential) {},
verificationFailed: (FirebaseAuthException e) {},
codeSent: (String verificationId, int? resendToken) {},
codeAutoRetrievalTimeout: (String verificationId) {},
);
יש 4 קריאות חזרה נפרדות שצריך לטפל בהן, וכל אחת מהן קובעת איך תעדכנו את ממשק המשתמש של האפליקציה:
- verificationCompleted: טיפול אוטומטי בקוד ה-SMS במכשירי Android.
- verificationFailed: טיפול באירועי כשל, כמו מספרי טלפון לא חוקיים או מעבר למכסת ה-SMS.
- codeSent: טיפול במקרה שבו קוד נשלח למכשיר מ-Firebase, כדי לבקש מהמשתמשים להזין את הקוד.
- codeAutoRetrievalTimeout: טיפול בזמן קצוב לתפוגה במקרה של כשל בטיפול האוטומטי בקוד SMS.
verificationCompleted
הטיפול הזה יקרא רק במכשירי Android שתומכים בפתרון אוטומטי של קודי SMS.
כשקוד ה-SMS יישלח למכשיר, מערכת Android תאמת את קוד ה-SMS באופן אוטומטי בלי לחייב את המשתמש להזין את הקוד באופן ידני. אם האירוע הזה מתרחש, המערכת מספקת באופן אוטומטי את הערך PhoneAuthCredential
, שאפשר להשתמש בו כדי להיכנס באמצעות מספר הטלפון של המשתמש או לקשר אותו.
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
verificationCompleted: (PhoneAuthCredential credential) async {
// ANDROID ONLY!
// Sign the user in (or link) with the auto-generated credential
await auth.signInWithCredential(credential);
},
);
verificationFailed
אם Firebase מחזיר שגיאה, למשל בגלל מספר טלפון שגוי או אם חרגתם מהמכסה של הודעות ה-SMS בפרויקט, יישלח FirebaseAuthException
למטפל הזה. במקרה כזה, תצטרכו להציג למשתמש הודעה על כך שמשהו השתבש, בהתאם לקוד השגיאה.
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
verificationFailed: (FirebaseAuthException e) {
if (e.code == 'invalid-phone-number') {
print('The provided phone number is not valid.');
}
// Handle other errors
},
);
codeSent
כש-Firebase שולחת קוד SMS למכשיר, הטיפול הזה מופעל עם verificationId
ו-resendToken
(האפשרות resendToken
נתמכת רק במכשירי Android, במכשירי iOS תמיד יוחזר ערך null
).
אחרי ההפעלה, כדאי לעדכן את ממשק המשתמש של האפליקציה כדי לבקש מהמשתמש להזין את קוד ה-SMS שהוא צפוי לקבל.
אחרי שמזינים את קוד ה-SMS, אפשר לשלב את מזהה האימות עם קוד ה-SMS כדי ליצור PhoneAuthCredential
חדש:
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
codeSent: (String verificationId, int? resendToken) async {
// Update the UI - wait for the user to enter the SMS code
String smsCode = 'xxxx';
// Create a PhoneAuthCredential with the code
PhoneAuthCredential credential = PhoneAuthProvider.credential(verificationId: verificationId, smsCode: smsCode);
// Sign the user in (or link) with the credential
await auth.signInWithCredential(credential);
},
);
כברירת מחדל, מערכת Firebase לא תשלח מחדש הודעות SMS חדשות אם הן נשלחו לאחרונה. עם זאת, אפשר לשנות את ההתנהגות הזו על-ידי קריאה חוזרת ל-method verifyPhoneNumber
עם האסימון לשליחה חוזרת לארגומנט forceResendingToken
.
אם הניסיון יצליח, הודעת ה-SMS תישלח מחדש.
codeAutoRetrievalTimeout
במכשירי Android שתומכים בפתרון אוטומטי של קודי SMS, הטיפול הזה יקרא אם המכשיר לא יפתור באופן אוטומטי הודעת SMS בתוך מסגרת זמן מסוימת. לאחר שתקופת הזמן תסתיים, המכשיר לא ינסה יותר לפתור את ההודעות הנכנסות.
כברירת מחדל, המכשיר ממתין 30 שניות, אבל אפשר להתאים אישית את משך ההמתנה באמצעות הארגומנט timeout
:
FirebaseAuth auth = FirebaseAuth.instance;
await auth.verifyPhoneNumber(
phoneNumber: '+44 7123 123 456',
timeout: const Duration(seconds: 60),
codeAutoRetrievalTimeout: (String verificationId) {
// Auto-resolution timed out...
},
);
באתר: signInWithPhoneNumber
בפלטפורמות אינטרנט, המשתמשים יכולים להיכנס לחשבון על ידי אישור שיש להם גישה לטלפון, על ידי הזנת קוד ה-SMS שנשלח למספר הטלפון שסיפקתם. כדי לשפר את האבטחה ולמנוע ספאם, המשתמשים מתבקשים להוכיח שהם בני אדם על ידי מילוי ווידג'ט של Google reCAPTCHA. לאחר האישור, קוד ה-SMS יישלח.
Firebase Authentication SDK ל-Flutter ינהל את הווידג'ט של reCAPTCHA כברירת מחדל, אבל נותן לכם שליטה על האופן שבו הוא מוצג ומוגדר, אם יש צורך.
כדי להתחיל, צריך להפעיל את השיטה signInWithPhoneNumber
עם מספר הטלפון.
FirebaseAuth auth = FirebaseAuth.instance;
// Wait for the user to complete the reCAPTCHA & for an SMS code to be sent.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456');
קריאה לשיטה תגרום להצגת הווידג'ט של reCAPTCHA. המשתמש צריך להשלים את הבדיקה לפני שקוד SMS יישלח. בסיום, תוכלו להזין את קוד ה-SMS בשיטה confirm
בתגובה ConfirmationResult
שהוחזרה:
UserCredential userCredential = await confirmationResult.confirm('123456');
בדומה לתהליכי כניסה אחרים, כניסה מוצלחת תפעיל את כל רכיבי ההאזנה למצב האימות שנרשמתם אליהם באפליקציה.
הגדרת reCAPTCHA
הווידג'ט של reCAPTCHA הוא תהליך מנוהל לחלוטין שמספק אבטחה לאפליקציית האינטרנט שלכם.
הארגומנט השני של signInWithPhoneNumber
מקבל מופע RecaptchaVerifier
אופציונלי שאפשר להשתמש בו כדי לנהל את הווידג'ט. כברירת מחדל, הווידג'ט יוצג כווידג'ט בלתי נראה כשתהליך הכניסה יופעל.
ווידג'ט 'בלתי נראה' יופיע כחלון מודאלי במסך מלא מעל האפליקציה.
עם זאת, אפשר להציג ווידג'ט בתוך הטקסט שהמשתמש צריך ללחוץ עליו באופן מפורש כדי לאמת את עצמו.
כדי להוסיף ווידג'ט בתוך שורת טקסט, מציינים מזהה של רכיב DOM בארגומנט container
של המופע RecaptchaVerifier
.
הרכיב חייב להתקיים ולהיות ריק, אחרת תופיע שגיאה.
אם לא מציינים ארגומנט container
, הווידג'ט יוצג כ'בלתי נראה'.
ConfirmationResult confirmationResult = await auth.signInWithPhoneNumber('+44 7123 123 456', RecaptchaVerifier(
container: 'recaptcha',
size: RecaptchaVerifierSize.compact,
theme: RecaptchaVerifierTheme.dark,
));
אפשר גם לשנות את הגודל והעיצוב על ידי התאמה אישית של הארגומנטים size
ו-theme
כפי שמתואר למעלה.
אפשר גם להאזין לאירועים, כמו אם המשתמש השלים את ה-reCAPTCHA, אם תוקף ה-reCAPTCHA פג או אם הושלחה שגיאה:
RecaptchaVerifier(
onSuccess: () => print('reCAPTCHA Completed!'),
onError: (FirebaseAuthException error) => print(error),
onExpired: () => print('reCAPTCHA Expired!'),
);
בדיקה
ב-Firebase יש תמיכה בבדיקת מספרי טלפון באופן מקומי:
- במסוף Firebase, בוחרים את ספק האימות 'טלפון' ולוחצים על התפריט הנפתח 'מספרי טלפון לבדיקה'.
- מזינים מספר טלפון חדש (למשל
+44 7444 555666
) וקוד בדיקה (למשל123456
).
אם מציינים מספר טלפון לבדיקה בשיטות verifyPhoneNumber
או signInWithPhoneNumber
, לא תישלח בפועל הודעת SMS. במקום זאת, תוכלו לספק את קוד הבדיקה ישירות ל-PhoneAuthProvider
או באמצעות הטיפול בתוצאות האישור של signInWithPhoneNumber
.