אימות טלפוני

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

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

אימות הטלפון של Firebase אינו נתמך בכל המדינות. אנא עיין בשאלות הנפוצות שלהם למידע נוסף.

להכין

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

  1. הפעל את הטלפון כשיטת כניסה במסוף Firebase .
  2. אנדרואיד : אם עדיין לא הגדרת את ה-hash SHA-1 של האפליקציה שלך במסוף Firebase , עשה זאת. ראה אימות הלקוח שלך למידע על מציאת ה-hash SHA-1 של האפליקציה שלך.
  3. iOS : ב-Xcode, אפשר הודעות דחיפה עבור הפרויקט שלך וודא שמפתח האימות של ה-APN שלך מוגדר עם Firebase Cloud Messaging (FCM) . בנוסף, עליך להפעיל מצבי רקע עבור התראות מרחוק. כדי להציג הסבר מעמיק של שלב זה, עיין בתיעוד Firebase iOS Phone Auth .
  4. אינטרנט : ודא שהוספת את דומיין היישומים שלך במסוף Firebase , תחת דומיינים להפניה מחדש של OAuth .

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

נוֹהָג

Firebase Authentication SDK for Flutter מספק שתי דרכים נפרדות להיכנס למשתמש עם מספר הטלפון שלו. פלטפורמות מקוריות (למשל אנדרואיד ו-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 התקשרויות נפרדות שעליך לטפל בהן, כל אחת תקבע כיצד תעדכן את ממשק המשתמש של האפליקציה:

  1. verificationCompleted : טיפול אוטומטי בקוד ה-SMS במכשירי אנדרואיד.
  2. אימות נכשל : טפל באירועי כשל כגון מספרי טלפון לא חוקיים או חריגה ממכסת ה-SMS.
  3. codeSent : טיפול כאשר קוד נשלח למכשיר מ-Firebase, משמש כדי להנחות משתמשים להזין את הקוד.
  4. codeAutoRetrievalTimeout : טיפול בזמן קצוב של כשל בטיפול אוטומטי בקוד SMS.

האימות הושלם

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

כאשר קוד ה-SMS נשלח למכשיר, אנדרואיד תאמת אוטומטית את קוד ה-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);
  },
);

האימות נכשל

אם 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
  },
);

קוד נשלח

כאשר Firebase שולח קוד SMS למכשיר, המטפל הזה מופעל עם verificationId ו- resendToken ( resendToken נתמך רק במכשירי אנדרואיד, מכשירי 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

במכשירי אנדרואיד התומכים ברזולוציה אוטומטית של קוד 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 for 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 מספקת תמיכה לבדיקה מקומית של מספרי טלפון:

  1. ב-Firebase Console, בחר את ספק האימות "טלפון" ולחץ על התפריט הנפתח "מספרי טלפון לבדיקה".
  2. הזן מספר טלפון חדש (למשל +44 7444 555666 ) וקוד בדיקה (למשל 123456 ).

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