אתם יכולים להשתמש באימות ב-Firebase כדי לשלוח לאימייל של המשתמש קישור, שבו הוא יוכל ללחוץ כדי להיכנס לחשבון. בתהליך הזה מתבצעת גם אימות של כתובת האימייל של המשתמש.
יש יתרונות רבים לכניסה באמצעות אימייל:
- הרשמה וכניסה ללא טרחה.
- סיכון נמוך יותר לשימוש חוזר בסיסמאות באפליקציות שונות, שעלול לפגוע באבטחה גם של סיסמאות שנבחרו היטב.
- היכולת לאמת משתמש תוך אימות שהוא הבעלים החוקיים של כתובת האימייל.
- כדי להיכנס, המשתמש צריך רק חשבון אימייל נגיש. אין צורך להיות הבעלים של מספר טלפון או חשבון ברשת חברתית.
- המשתמש יכול להיכנס לחשבון באופן מאובטח בלי לספק (או לזכור) סיסמה, שיכולה להיות מסורבלת במכשיר נייד.
- משתמש קיים שנכנס בעבר באמצעות מזהה אימייל (סיסמה או איחוד) יכול לשדרג את החשבון שלו כך שיוכל להיכנס באמצעות כתובת האימייל בלבד. לדוגמה, משתמש ששכח את הסיסמה עדיין יכול להיכנס לחשבון בלי לאפס את הסיסמה.
לפני שמתחילים
שימוש ב-Swift Package Manager כדי להתקין ולנהל יחסי תלות ב-Firebase.
- ב-Xcode, כשפרויקט האפליקציה פתוח, עוברים אל קובץ > הוספת חבילות.
- כשמופיעה בקשה, מוסיפים את המאגר של Firebase SDK לפלטפורמות של Apple:
- בוחרים את הספרייה Firebase Authentication.
- מוסיפים את הדגל
-ObjC
לקטע Other Linker Flags (דגלים אחרים של קישור) בהגדרות ה-build של היעד. - בסיום, Xcode יתחיל לפתור את יחסי התלות ולהוריד אותם באופן אוטומטי ברקע.
https://github.com/firebase/firebase-ios-sdk.git
הפעלת כניסה באמצעות קישור לאימייל בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות קישור באימייל, קודם צריך להפעיל את ספק האימייל ואת שיטת הכניסה באמצעות קישור באימייל בפרויקט Firebase:
- במסוף Firebase, פותחים את הקטע Auth.
- בכרטיסייה Sign in method (שיטת כניסה), מפעילים את הספק Email/Password (אימייל/סיסמה). חשוב לזכור: כדי להשתמש בכניסה באמצעות קישור לאימייל, צריך להפעיל את הכניסה באמצעות כתובת אימייל/סיסמה.
- באותו קטע, מפעילים את שיטת הכניסה קישור לאימייל (כניסה ללא סיסמה).
- לוחצים על שמירה.
שליחת קישור אימות לכתובת האימייל של המשתמש
כדי להתחיל את תהליך האימות, מציגים למשתמש ממשק שמבקש ממנו לספק את כתובת האימייל שלו, ואז קוראים ל-sendSignInLink
כדי לבקש מ-Firebase לשלוח את הקישור לאימות לכתובת האימייל של המשתמש.
יוצרים את האובייקט
ActionCodeSettings
, שמספק ל-Firebase הוראות ליצירת הקישור לאימייל. מגדירים את השדות הבאים:url
: קישור העומק להטמעה וכל מצב נוסף שרוצים להעביר. הדומיין של הקישור צריך להיכלל ברשימת ההיתרים של הדומיינים המורשים במסוף Firebase. כדי למצוא את הרשימה הזו, עוברים לכרטיסייה 'שיטת כניסה' (Authentication -> Sign-in method).iOSBundleID
ו-androidPackageName
: עוזרים ל-Firebase Authentication לקבוע אם ליצור קישור לאינטרנט בלבד או קישור לנייד שייפתח במכשיר Android או Apple.handleCodeInApp
: מוגדר כ-true. תמיד צריך להשלים את פעולת הכניסה באפליקציה, בניגוד לפעולות אחרות באימייל מחוץ לצ'אט (איפוס סיסמה ואימותים באימייל). הסיבה לכך היא שבסוף התהליך, המשתמש אמור להיכנס לחשבון ומצב האימות שלו נשמר באפליקציה.linkDomain
: כשמגדירים דומיינים מותאמים אישית של קישורים מסוג Hosting לפרויקט, צריך לציין באיזה מהם להשתמש כשהקישור ייפתח על ידי אפליקציה ניידת מסוימת. אחרת, דומיין ברירת המחדל ייבחר באופן אוטומטי (לדוגמה, ).PROJECT_ID.firebaseapp.com
dynamicLinkDomain
: הוצא משימוש. אין לציין את הפרמטר הזה.
Swift
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
זמין בקטע העברת מצב בפעולות אימייל.מבקשים מהמשתמש את כתובת האימייל שלו.
שולחים את הקישור לאימות לכתובת האימייל של המשתמש, ושומרים את כתובת האימייל של המשתמש למקרה שהמשתמש ישלים את תהליך הכניסה באמצעות האימייל באותו מכשיר.
Swift
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 מחייב לספק את כתובת האימייל של המשתמש במהלך תהליך הכניסה. כדי שהכניסה תתבצע, כתובת האימייל הזו צריכה להתאים לכתובת שאליה נשלח הקישור לכניסה במקור.
כדי לייעל את התהליך הזה למשתמשים שפותחים את הקישור לכניסה באותו מכשיר שבו הם מבקשים את הקישור, אפשר לאחסן את כתובת האימייל שלהם באופן מקומי כששולחים את האימייל לכניסה. לאחר מכן, משתמשים בכתובת הזו כדי להשלים את התהליך.
בסיום הכניסה, כל מנגנון כניסה קודם לא מאומת יוסר מהמשתמש וכל הסשנים הקיימים יבוטלו. לדוגמה, אם מישהו יצר בעבר חשבון לא מאומת עם אותה כתובת אימייל וסיסמה, הסיסמה של המשתמש תוסר כדי למנוע מהמתחזה שטען לבעלות על החשבון הזה ויצר אותו להיכנס שוב לאותו חשבון.
השלמת הכניסה באפליקציה לנייד של Apple
Firebase Authentication משתמש ב-Firebase Hosting כדי לשלוח את הקישור באימייל למכשיר נייד. כדי להשלים את הכניסה באמצעות אפליקציה לנייד, צריך להגדיר את האפליקציה כך שתזהה את הקישור לאפליקציה הנכנס, תנתח את קישור העומק הבסיסי ואז תשלים את הכניסה. מידע נוסף על קישורים אוניברסליים ודומיינים משויכים ב-iOS
הגדרה של Firebase Hosting
Firebase Authentication משתמש בדומיינים של Firebase Hosting כשיוצרים ושולחים קישור שנועד להיפתח באפליקציה לנייד. כבר הוגדר עבורכם דומיין Firebase Hosting כברירת מחדל.
מגדירים דומיינים של Firebase Hosting:
במסוף Firebase, פותחים את הקטע Hosting.
אם רוצים להשתמש בדומיין ברירת המחדל בקישור לאימייל שנפתח באפליקציות לנייד, עוברים לאתר ברירת המחדל ומתעדים את הדומיין Hosting שמוגדר כברירת מחדל. דומיין Hosting שמוגדר כברירת מחדל נראה בדרך כלל כך:
.PROJECT_ID.firebaseapp.com
תצטרכו את הערך הזה כשתגדירו לאפליקציה ליירט את הקישור הנכנס.
אם אתם רוצים להשתמש בדומיין מותאם אישית לקישור באימייל, תוכלו לרשום דומיין ב-Firebase Hosting ולהשתמש בו כדומיין של הקישור.
הגדרת אפליקציות של Apple:
תצטרכו להגדיר את הדומיין שבחרתם כדומיין משויך לקישורים לאפליקציות. כדי להגדיר את ההרשאה באפליקציה, פותחים את הכרטיסייה Signing & Capabilities (חתימה ויכולות) של היעד ב-Xcode ומוסיפים את הדומיינים של Firebase Hosting מהשלב הקודם ליכולת Associated Domains (דומיינים משויכים). אם משתמשים בדומיין Firebase Hosting שמוגדר כברירת מחדל, הערך יהיה
.applinks:PROJECT_ID.firebaseapp.com
מידע נוסף זמין במאמר תמיכה בדומיינים משויכים באתר התיעוד של Apple.
אימות הקישור והרשמה
אחרי שתקבלו את הקישור כפי שמתואר למעלה, עליכם לוודא שהוא מיועד לאימות באמצעות קישור באימייל ולהשלים את הכניסה.
Swift
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.
במדריך לאפליקציות אינטרנט מוסבר איך מטפלים בכניסה באמצעות קישור לאימייל באפליקציית אינטרנט.
קישור או אימות מחדש באמצעות קישור באימייל
אפשר גם לקשר את שיטת האימות הזו למשתמש קיים. לדוגמה, משתמש שעבר אימות באמצעות ספק אחר, כמו מספר טלפון, יכול להוסיף את שיטת הכניסה הזו לחשבון הקיים שלו.
ההבדל יהיה במחצית השנייה של הפעולה:
Swift
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. }];
אפשר להשתמש בכך גם כדי לבצע אימות מחדש של משתמש עם קישור לאימייל לפני שמריצים פעולה עם מידע רגיש.
Swift
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. }];
עם זאת, מכיוון שהתהליך עשוי להסתיים במכשיר אחר שבו המשתמש המקורי לא היה מחובר לחשבון, יכול להיות שהתהליך לא יושלם. במקרה כזה, אפשר להציג למשתמש הודעת שגיאה כדי לאלץ אותו לפתוח את הקישור באותו מכשיר. אפשר להעביר מצב מסוים בקישור כדי לספק מידע על סוג הפעולה ועל מזהה המשתמש.
הוצא משימוש: אימות שמבוסס על Firebase Dynamic Links
לפני גרסה 11.8.0 של Firebase Authentication iOS SDK, התכונה 'כניסה באמצעות קישור לאימייל' הסתמכה על Firebase Dynamic Links כדי לפתוח קישורי כניסה באפליקציה הנכונה. קישורי האימות האלה הוצאו משימוש, כי Firebase Dynamic Links ייסגר ב-25 באוגוסט 2025.
אם האפליקציה שלכם משתמשת בקישורים בסגנון הישן, עליכם להעביר את האפליקציה למערכת החדשה שמבוססת על Firebase Hosting.
הוצא משימוש: הבחנה בין כתובת אימייל עם סיסמה לבין קישור לאימייל
אם יצרתם את הפרויקט ב-15 בספטמבר 2023 או לאחר מכן, ההגנה מפני ספירת כתובות אימייל מופעלת כברירת מחדל. התכונה הזו משפרת את האבטחה של חשבונות המשתמשים בפרויקט, אבל היא משביתה את השיטה fetchSignInMethodsForEmail()
, שבעבר המלצנו להשתמש בה כדי להטמיע תהליכים שמתחילים במזהה.
אפשר להשבית את ההגנה על ספירת כתובות האימייל בפרויקט, אבל אנחנו ממליצים לא לעשות זאת.
מידע נוסף על הפעלה או השבתה של הגנה מפני ספירת כתובות אימייל
השלבים הבאים
אחרי שמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר לפרטי הכניסה – כלומר שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האימות – שבאמצעותם המשתמש נכנס לחשבון. החשבון החדש הזה מאוחסן כחלק מפרויקט Firebase, וניתן להשתמש בו כדי לזהות משתמש בכל האפליקציות בפרויקט, ללא קשר לאופן שבו המשתמש נכנס לחשבון.
-
באפליקציות, אפשר לקבל את פרטי הפרופיל הבסיסיים של המשתמש מהאובייקט
User
. ניהול משתמשים בכללי האבטחה של Firebase Realtime Database ו-Cloud Storage, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש שנכנס לחשבון מהמשתנה
auth
, ולהשתמש בו כדי לקבוע לאילו נתונים למשתמש תהיה גישה.
כדי לאפשר למשתמשים להיכנס לאפליקציה באמצעות כמה ספקי אימות, אפשר לקשר את פרטי הכניסה של ספק האימות לחשבון משתמש קיים.
כדי להוציא משתמש מהחשבון, קוראים ל-
signOut:
.
Swift
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; }
מומלץ גם להוסיף קוד לטיפול בשגיאות לכל מגוון השגיאות באימות. טיפול בשגיאות