אימות עם Firebase באמצעות קישורי דוא"ל

אתה יכול להשתמש ב-Firebase Authentication כדי להיכנס למשתמש על ידי שליחת דוא"ל המכיל קישור, עליו הם יכולים ללחוץ כדי להיכנס. בתהליך, כתובת הדוא"ל של המשתמש מאומתת גם.

ישנן יתרונות רבים לכניסה בדוא"ל:

  • הרשמה וכניסה לחיכוך נמוך.
  • סיכון נמוך יותר לשימוש חוזר בסיסמאות בין יישומים, מה שעלול לערער את האבטחה אפילו של סיסמאות שנבחרו היטב.
  • היכולת לאמת משתמש תוך אימות שהמשתמש הוא הבעלים הלגיטימי של כתובת אימייל.
  • משתמש צריך רק חשבון דוא"ל נגיש כדי להיכנס. אין צורך בבעלות על מספר טלפון או חשבון מדיה חברתית.
  • משתמש יכול להיכנס בצורה מאובטחת ללא צורך לספק (או לזכור) סיסמה, מה שעלול להיות מסורבל במכשיר נייד.
  • משתמש קיים שנכנס בעבר עם מזהה דוא"ל (סיסמה או מאוחדת) יכול להשתדרג לכניסה באמצעות הדוא"ל בלבד. לדוגמה, משתמש ששכח את הסיסמה שלו עדיין יכול להיכנס ללא צורך לאפס את הסיסמה שלו.

לפני שאתה מתחיל

  1. אם עדיין לא עשית זאת, בצע את השלבים במדריך התחל .

  2. הפעל כניסה באמצעות Email Link עבור פרויקט Firebase שלך.

    כדי להיכנס למשתמשים באמצעות קישור דוא"ל, תחילה עליך להפעיל את שיטת הכניסה של ספק הדוא"ל ושיטת הכניסה לקישור דוא"ל עבור פרויקט Firebase שלך:

    1. במסוף Firebase , פתח את הקטע Auth .
    2. בכרטיסייה שיטת כניסה , הפעל את ספק הדוא"ל/סיסמה . שים לב שכניסה לדוא"ל/סיסמה חייבת להיות מופעלת כדי להשתמש בכניסה לקישור דוא"ל.
    3. באותו קטע, הפעל את שיטת הכניסה של קישור דוא"ל (כניסה ללא סיסמה) .
    4. לחץ על שמור .

כדי להתחיל את זרימת האימות, הצג ממשק שמבקש מהמשתמש לספק את כתובת הדוא"ל שלו ולאחר מכן התקשר ל- sendSignInLinkToEmail() כדי לבקש מ-Firebase לשלוח את קישור האימות לאימייל של המשתמש.

  1. בנה את האובייקט ActionCodeSettings, המספק ל-Firebase הוראות כיצד לבנות את קישור הדוא"ל. הגדר את השדות הבאים:

    • url : הקישור העמוק להטמעה וכל מצב נוסף שיועבר. יש לרשום את הדומיין של הקישור ברשימת ה-Firebase Console של דומיינים מורשים, אותה ניתן למצוא על ידי מעבר לכרטיסייה שיטת כניסה (אימות -> שיטת כניסה). הקישור יפנה את המשתמש לכתובת האתר הזו אם האפליקציה לא מותקנת במכשיר שלו ולא ניתן היה להתקין את האפליקציה.

    • androidPackageName ו- IOSBundleId : האפליקציות שבהן ניתן להשתמש כאשר קישור הכניסה נפתח במכשיר אנדרואיד או iOS. למד עוד כיצד להגדיר את Firebase Dynamic Links לפתיחת קישורי פעולות דוא"ל באמצעות אפליקציות לנייד.

    • handleCodeInApp : מוגדר ל- true . יש להשלים תמיד את פעולת הכניסה באפליקציה בניגוד לפעולות דוא"ל אחרות מחוץ לתחום (איפוס סיסמה ואימותי דוא"ל). הסיבה לכך היא שבסוף הזרימה, המשתמש צפוי להיות מחובר ומצב האימות שלו יישאר באפליקציה.

    • dynamicLinkDomain : כאשר מוגדרים מספר דומיינים של קישורים דינמיים מותאמים אישית עבור פרויקט, ציין באיזה תחום להשתמש כאשר הקישור ייפתח באמצעות אפליקציה סלולרית שצוינה (לדוגמה, example.page.link ). אחרת הדומיין הראשון נבחר אוטומטית.

    var acs = ActionCodeSettings(
        // URL you want to redirect back to. The domain (www.example.com) for this
        // URL must be whitelisted in the Firebase Console.
        url: 'https://www.example.com/finishSignUp?cartId=1234',
        // This must be true
        handleCodeInApp: true,
        iOSBundleId: 'com.example.ios',
        androidPackageName: 'com.example.android',
        // installIfNotAvailable
        androidInstallApp: true,
        // minimumVersion
        androidMinimumVersion: '12');
    
  2. בקש מהמשתמש את האימייל שלו.

  3. שלח את קישור האימות לאימייל של המשתמש, ושמור את האימייל של המשתמש למקרה שהמשתמש ישלים את הכניסה לאימייל באותו מכשיר.

    var emailAuth = 'someemail@domain.com';
    FirebaseAuth.instance.sendSignInLinkToEmail(
            email: emailAuth, actionCodeSettings: acs)
        .catchError((onError) => print('Error sending email verification $onError'))
        .then((value) => print('Successfully sent email verification'));
    });
    

דאגות ביטחוניות

כדי למנוע שימוש בקישור כניסה לכניסה כמשתמש לא מכוון או במכשיר לא מכוון, Firebase Auth מחייב לספק את כתובת האימייל של המשתמש בעת השלמת תהליך הכניסה. כדי שהכניסה תצליח, כתובת דוא"ל זו חייבת להתאים לכתובת שאליה נשלח קישור הכניסה במקור.

אתה יכול לייעל זרימה זו עבור משתמשים שפותחים את קישור הכניסה באותו מכשיר שהם מבקשים את הקישור, על ידי אחסון כתובת הדוא"ל שלהם באופן מקומי - למשל באמצעות SharedPreferences - כאשר אתה שולח את דוא"ל הכניסה. לאחר מכן, השתמש בכתובת זו כדי להשלים את הזרימה. אל תעביר את האימייל של המשתמש בפרמטרים של כתובת האתר להפניה מחדש ותעשה בו שימוש חוזר מכיוון שהדבר עלול לאפשר הזרקות הפעלה.

לאחר השלמת הכניסה, כל מנגנון כניסה לא מאומת קודם יוסר מהמשתמש וכל הפעלות קיימות יבוטלו. לדוגמה, אם מישהו יצר בעבר חשבון לא מאומת עם אותם דוא"ל וסיסמה, סיסמת המשתמש תוסר כדי למנוע מהמתחזה שטען לבעלות ויצר את החשבון הלא מאומת הזה להיכנס שוב עם האימייל והסיסמה הלא מאומתים.

כמו כן ודא שאתה משתמש בכתובת URL של HTTPS בייצור כדי למנוע את הקישור שלך שיירטו על ידי שרתי מתווכים.

אימות Firebase משתמש בקישורים דינמיים של Firebase כדי לשלוח את קישור האימייל למכשיר נייד. להשלמת כניסה באמצעות אפליקציה לנייד, יש להגדיר את האפליקציה לזהות את קישור האפליקציה הנכנס, לנתח את הקישור העמוק הבסיסי ולאחר מכן להשלים את הכניסה.

  1. הגדר את האפליקציה שלך כדי לקבל קישורים דינמיים על Flutter במדריך .

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

    // Confirm the link is a sign-in with email link.
    if (FirebaseAuth.instance.isSignInWithEmailLink(emailLink)) {
      try {
        // The client SDK will parse the code from the link for you.
        final userCredential = await FirebaseAuth.instance
            .signInWithEmailLink(email: emailAuth, emailLink: emailLink);
    
        // You can access the new user via userCredential.user.
        final emailAddress = userCredential.user?.email;
    
        print('Successfully signed in with email link!');
      } catch (error) {
        print('Error signing in with email link.');
      }
    }
    

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

ההבדל יהיה במחצית השנייה של הפעולה:

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.linkWithCredential(authCredential);
} catch (error) {
    print("Error linking emailLink credential.");
}

זה יכול לשמש גם כדי לאמת מחדש משתמש בקישור דוא"ל לפני הפעלת פעולה רגישה.

final authCredential = EmailAuthProvider
    .credentialWithLink(email: emailAuth, emailLink: emailLink.toString());
try {
    await FirebaseAuth.instance.currentUser
        ?.reauthenticateWithCredential(authCredential);
} catch (error) {
    print("Error reauthenticating credential.");
}

עם זאת, מכיוון שהזרימה עלולה להסתיים במכשיר אחר שבו המשתמש המקורי לא היה מחובר, ייתכן שהזרימה הזו לא תושלם. במקרה זה, ניתן להציג שגיאה למשתמש כדי לאלץ אותו לפתוח את הקישור באותו מכשיר. ניתן להעביר מצב מסוים בקישור כדי לספק מידע על סוג הפעולה ו-uid המשתמש.

אם יצרת את הפרויקט שלך ב-15 בספטמבר 2023 או אחריו, הגנת ספירת דוא"ל מופעלת כברירת מחדל. תכונה זו משפרת את האבטחה של חשבונות המשתמש של הפרוייקט שלך, אך היא משביתה את שיטת fetchSignInMethodsForEmail() , עליה המלצנו בעבר ליישם זרימות מזהה-ראשון.

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

עיין בתיעוד על הגנת ספירת דוא"ל לפרטים נוספים.

הצעדים הבאים

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

באפליקציות שלך, תוכל לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט User . ראה ניהול משתמשים .

בכללי האבטחה שלך במסד הנתונים בזמן אמת של Firebase וב-Cloud Storage, תוכל לקבל את מזהה המשתמש הייחודי של המשתמש המחובר ממשתנה auth , ולהשתמש בו כדי לשלוט לאילו נתונים המשתמש יכול לגשת.

אתה יכול לאפשר למשתמשים להיכנס לאפליקציה שלך באמצעות ספקי אימות מרובים על ידי קישור אישורי ספק אישורים לחשבון משתמש קיים.

כדי לצאת ממשתמש, התקשר ל- signOut() :

await FirebaseAuth.instance.signOut();