אימות באמצעות הטלפון מאפשר למשתמשים להיכנס ל-Firebase באמצעות הטלפון שלהם כמאמת. הודעת SMS נשלחת למשתמש (למספר הטלפון שצוין) עם קוד ייחודי. אחרי שמאשרים את הקוד, המשתמש יכול להיכנס ל-Firebase.
מספרי טלפון שמשתמשי קצה מספקים לצורך אימות יישלחו וייאוחסנו על ידי Google כדי לשפר את המניעה של ספאם וניצול לרעה בשירותי Google, כולל ב-Firebase, אבל לא רק. מפתחים צריכים לוודא שיש להם את הסכמת משתמשי הקצה המתאימה לפני שהם משתמשים בשירות הכניסה באמצעות מספר טלפון של Firebase Authentication.
אימות טלפון ב-Firebase לא נתמך בכל המדינות. מידע נוסף מופיע בשאלות הנפוצות שלהם.
הגדרה
לפני שמתחילים להשתמש באימות טלפוני, חשוב לוודא שביצעתם את השלבים הבאים:
- מפעילים את האפשרות 'טלפון' כשיטת כניסה במסוף Firebase.
- Android: אם עדיין לא הגדרתם את הגיבוב SHA-1 של האפליקציה במסוף Firebase, עליכם לעשות זאת. במאמר אימות הלקוח מוסבר איך למצוא את הגיבוב SHA-1 של האפליקציה.
- iOS: ב-Xcode, מפעילים התראות Push לפרויקט ומוודאים שמפתח האימות של APNs מוגדר עם העברת הודעות בענן ב-Firebase (FCM). בנוסף, צריך להפעיל מצבי רקע להתראות מרחוק. לקבלת הסבר מפורט על השלב הזה, אפשר לעיין במסמכי התיעוד בנושא אימות טלפוני ב-Firebase ל-iOS.
- אינטרנט: מוודאים שהוספתם את הדומיין של האפליקציה במסוף Firebase, בקטע דומיינים להפניה אוטומטית של OAuth.
הערה: אפשר להיכנס לחשבון באמצעות מספר טלפון רק במכשירים אמיתיים ובאינטרנט. כדי לבדוק את תהליך האימות באמולטורים של מכשירים, אפשר לעיין במאמר בנושא בדיקות.
שימוש
ה-SDK של Firebase Authentication ל-Flutter מספק שתי דרכים נפרדות לאימות משתמש באמצעות מספר הטלפון שלו. פלטפורמות מקוריות (למשל Android ו-iOS) מספקות פונקציונליות שונה לאימות מספר טלפון מאשר האינטרנט, ולכן קיימות שתי שיטות לכל פלטפורמה באופן בלעדי:
- פלטפורמה מקורית:
verifyPhoneNumber. - פלטפורמת אינטרנט:
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 קריאות חוזרות (callback) נפרדות שצריך לטפל בהן, וכל אחת מהן תקבע איך לעדכן את ממשק המשתמש של האפליקציה:
- verificationCompleted: טיפול אוטומטי בקוד ה-SMS במכשירי Android.
- verificationFailed: טיפול באירועי כשל כמו מספרי טלפון לא תקינים או חריגה ממכסת ה-SMS.
- codeSent: טיפול במצב שבו קוד נשלח למכשיר מ-Firebase. משמש להצגת בקשה למשתמשים להזין את הקוד.
- codeAutoRetrievalTimeout: הגדרה של זמן קצוב לתפוגה במקרה של כשל בטיפול אוטומטי בקוד SMS.
verificationCompleted
ה-handler הזה יופעל רק במכשירי Android שתומכים בזיהוי אוטומטי של קודי SMS.
כשקוד ה-SMS מועבר למכשיר, מערכת Android מאמתת אותו באופן אוטומטי בלי שהמשתמש צריך להזין אותו ידנית. אם האירוע הזה מתרחש, המערכת מספקת באופן אוטומטי 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 יישלח ל-handler הזה. במקרה כזה, תציגו למשתמש הודעה על כך שמשהו השתבש, בהתאם לקוד השגיאה.
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 למכשיר, ה-handler הזה מופעל עם 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 חדשה אם היא נשלחה לאחרונה. אבל אפשר לשנות את ההתנהגות הזו על ידי קריאה חוזרת למתודה verifyPhoneNumber עם טוקן השליחה מחדש לארגומנט forceResendingToken.
אם הפעולה תצליח, הודעת ה-SMS תישלח מחדש.
codeAutoRetrievalTimeout
במכשירי Android שתומכים בפענוח אוטומטי של קוד SMS, ה-handler הזה יופעל אם המכשיר לא פענח אוטומטית הודעת 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 או באמצעות signInWithPhoneNumbers handler לתוצאות אישור.