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

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

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

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

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

השתמש ב- Swift Package Manager כדי להתקין ולנהל תלות ב-Firebase.

  1. ב-Xcode, כשפרויקט האפליקציה שלך פתוח, נווט אל קובץ > הוסף חבילות .
  2. כשתתבקש, הוסף את מאגר Firebase Apple platforms SDK:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. בחר את ספריית האימות של Firebase.
  5. הוסף את הדגל -ObjC לקטע Other Linker Flags של הגדרות הבנייה של היעד שלך.
  6. בסיום, Xcode יתחיל באופן אוטומטי לפתור ולהוריד את התלות שלך ברקע.

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

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

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

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

    • url: הקישור העמוק להטמעה וכל מצב נוסף שיועבר. יש לרשום את הדומיין של הקישור ברשימת ה-Firebase Console של דומיינים מורשים, אותה ניתן למצוא על ידי מעבר לכרטיסייה שיטת כניסה (אימות -> שיטת כניסה).
    • iOSBundleID ו-androidPackageName : האפליקציות שבהן ניתן להשתמש כאשר קישור הכניסה נפתח במכשיר אנדרואיד או אפל. למד עוד כיצד להגדיר את Firebase Dynamic Links לפתיחת קישורי פעולות דוא"ל באמצעות אפליקציות לנייד.
    • handleCodeInApp: מוגדר ל-true. יש להשלים תמיד את פעולת הכניסה באפליקציה בניגוד לפעולות דוא"ל אחרות מחוץ לתחום (איפוס סיסמה ואימותי דוא"ל). הסיבה לכך היא שבסוף הזרימה, המשתמש צפוי להיות מחובר ומצב האימות שלו יישאר באפליקציה.
    • dynamicLinkDomain: כאשר מוגדרים מספר דומיינים של קישורים דינמיים מותאמים אישית עבור פרויקט, ציין באיזה תחום להשתמש כאשר הקישור ייפתח באמצעות אפליקציה סלולרית שצוינה (לדוגמה, example.page.link ). אחרת הדומיין הראשון נבחר אוטומטית.

    מָהִיר

    let actionCodeSettings = ActionCodeSettings()
    actionCodeSettings.url = URL(string: "https://www.example.com")
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = true
    actionCodeSettings.setIOSBundleID(Bundle.main.bundleIdentifier!)
    actionCodeSettings.setAndroidPackageName("com.example.android",
                                             installIfNotAvailable: false, minimumVersion: "12")
    

    Objective-C

    FIRActionCodeSettings *actionCodeSettings = [[FIRActionCodeSettings alloc] init];
    [actionCodeSettings setURL:[NSURL URLWithString:@"https://www.example.com"]];
    // The sign-in operation has to always be completed in the app.
    actionCodeSettings.handleCodeInApp = YES;
    [actionCodeSettings setIOSBundleID:[[NSBundle mainBundle] bundleIdentifier]];
    [actionCodeSettings setAndroidPackageName:@"com.example.android"
                        installIfNotAvailable:NO
                               minimumVersion:@"12"];
    

    למידע נוסף על ActionCodeSettings, עיין בסעיף מצב עובר בפעולות דואר אלקטרוני .

  2. בקש מהמשתמש את האימייל שלו.

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

    מָהִיר

    Auth.auth().sendSignInLink(toEmail: email,
                               actionCodeSettings: actionCodeSettings) { error in
      // ...
        if let error = error {
          self.showMessagePrompt(error.localizedDescription)
          return
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        UserDefaults.standard.set(email, forKey: "Email")
        self.showMessagePrompt("Check your email for link")
        // ...
    }
    

    Objective-C

    [[FIRAuth auth] sendSignInLinkToEmail:email
                       actionCodeSettings:actionCodeSettings
                               completion:^(NSError *_Nullable error) {
      // ...
        if (error) {
          [self showMessagePrompt:error.localizedDescription];
           return;
        }
        // The link was successfully sent. Inform the user.
        // Save the email locally so you don't need to ask the user for it again
        // if they open the link on the same device.
        [NSUserDefaults.standardUserDefaults setObject:email forKey:@"Email"];
        [self showMessagePrompt:@"Check your email for link"];
        // ...
    }];
    

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

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

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

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

השלמת כניסה באפליקציית Apple לנייד

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

Firebase Auth משתמש ב-Firebase Dynamic Links בעת שליחת קישור שאמור להיפתח באפליקציה לנייד. על מנת להשתמש בתכונה זו, יש להגדיר קישורים דינמיים ב-Firebase Console.

  1. הפעל קישורים דינמיים של Firebase:

    1. במסוף Firebase , פתח את הקטע קישורים דינמיים .
    2. אם עדיין לא הסכמתם לתנאי ה-Dynamic Links ויצרתם תחום Dynamic Links, עשו זאת כעת.

      אם כבר יצרת דומיין Dynamic Links, שים לב לזה. תחום קישורים דינמיים נראה בדרך כלל כמו הדוגמה הבאה:

      example.page.link

      תזדקק לערך זה כאשר תגדיר את אפליקציית Apple או Android ליירט את הקישור הנכנס.

  2. הגדרת יישומי אפל:

    1. אם אתה מתכנן לטפל בקישורים האלה מהאפליקציה שלך, יש לציין את מזהה החבילה בהגדרות הפרויקט של Firebase Console. בנוסף, יש לציין גם את מזהה ה-App Store ואת מזהה צוות המפתחים של Apple.
    2. תצטרך גם להגדיר את תחום המטפל בפעולות הדוא"ל שלך כדומיין משויך ביכולות היישום שלך. כברירת מחדל, המטפל בפעולות הדוא"ל מתארח בדומיין כמו הדוגמה הבאה:
      APP_ID.firebaseapp.com
    3. אם אתה מתכנן להפיץ את האפליקציה שלך לגרסאות iOS 8 ומטה, תצטרך להגדיר את מזהה החבילה שלך כסכימה מותאמת אישית עבור כתובות URL נכנסות.
    4. למידע נוסף על כך, עיין בהוראות קבלת קישורים דינמיים של פלטפורמת Apple .

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

מָהִיר

if Auth.auth().isSignIn(withEmailLink: link) {
        Auth.auth().signIn(withEmail: email, link: self.link) { user, error in
          // ...
        }
}

Objective-C

if ([[FIRAuth auth] isSignInWithEmailLink:link]) {
    [[FIRAuth auth] signInWithEmail:email
                               link:link
                         completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
      // ...
    }];
}

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

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

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

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

מָהִיר

  let credential = EmailAuthCredential.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.link(with: credential) { authData, error in
    if (error) {
      // And error occurred during linking.
      return
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthProvider credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      linkWithCredential:credential
              completion:^(FIRAuthDataResult *_Nullable result,
                           NSError *_Nullable error) {
    if (error) {
      // And error occurred during linking.
      return;
    }
    // The provider was successfully linked.
    // The phone user can now sign in with their phone number or email.
  }];

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

מָהִיר

  let credential = EmailAuthProvider.credential(withEmail:email
                                                       link:link)
  Auth.auth().currentUser?.reauthenticate(with: credential) { authData, error in
    if (error) {
      // And error occurred during re-authentication.
      return
    }
    // The user was successfully re-authenticated.
  }

Objective-C

  FIRAuthCredential *credential =
      [FIREmailAuthCredential credentialWithEmail:email link:link];
  [FIRAuth auth].currentUser
      reauthenticateWithCredential:credential
                        completion:^(FIRAuthDataResult *_Nullable result,
                                     NSError *_Nullable error) {
    if (error) {
      // And error occurred during re-authentication
      return;
    }
    // The user was successfully re-authenticated.
  }];

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

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

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

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

הצעדים הבאים

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

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

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

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

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

מָהִיר

let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print("Error signing out: %@", signOutError)
}

Objective-C

NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

ייתכן שתרצה להוסיף קוד לטיפול בשגיאות עבור כל מגוון שגיאות האימות. ראה טיפול בשגיאות .