אתם יכולים להשתמש באימות ב-Firebase כדי לאפשר למשתמש להיכנס לחשבון על ידי שליחת אימייל עם קישור, שאפשר ללחוץ עליו כדי להיכנס לחשבון. במהלך התהליך, כתובת האימייל של המשתמש מאומתת.
יש הרבה יתרונות לכניסה באמצעות אימייל:
- הרשמה וכניסה פשוטות.
- הסיכון לשימוש חוזר בסיסמאות באפליקציות שונות נמוך יותר, מה שיכול לפגוע באבטחה של סיסמאות שנבחרו בקפידה.
- היכולת לאמת משתמש וגם לוודא שהוא הבעלים הלגיטימי של כתובת אימייל.
- משתמשים צריכים רק חשבון אימייל נגיש כדי להיכנס. לא נדרשת בעלות על מספר טלפון או על חשבון במדיה החברתית.
- משתמש יכול להיכנס לחשבון בצורה מאובטחת בלי לספק (או לזכור) סיסמה, מה שיכול להיות מסורבל במכשיר נייד.
- משתמש קיים שנכנס בעבר באמצעות מזהה אימייל (סיסמה או איחוד) יכול לשדרג את הכניסה שלו כך שתתבצע רק באמצעות האימייל. לדוגמה, משתמש ששכח את הסיסמה שלו עדיין יכול להיכנס לחשבון בלי לאפס את הסיסמה.
לפני שמתחילים
משתמשים ב-Swift Package Manager כדי להתקין ולנהל יחסי תלות ב-Firebase.
- ב-Xcode, כשהפרויקט של האפליקציה פתוח, עוברים אל File > Add Packages (קובץ > הוספת חבילות).
- כשמוצגת בקשה, מוסיפים את מאגר Firebase Apple platforms SDK:
- בוחרים את הספרייה Firebase Authentication.
- מוסיפים את הדגל
-ObjC
לקטע Other Linker Flags בהגדרות הבנייה של היעד. - אחרי שתסיימו, פלטפורמת Xcode תתחיל באופן אוטומטי לטפל ביחסי התלות ולהוריד אותם ברקע.
https://github.com/firebase/firebase-ios-sdk.git
הפעלת התחברות באמצעות קישור באימייל בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות קישור באימייל, קודם צריך להפעיל את ספק האימייל ואת שיטת הכניסה באמצעות קישור באימייל בפרויקט Firebase:
- במסוף Firebase, פותחים את הקטע אימות.
- בכרטיסייה שיטת הכניסה, מפעילים את ספק האימייל/הסיסמה. הערה כדי להשתמש בכניסה באמצעות קישור באימייל, צריך להפעיל כניסה באמצעות כתובת אימייל או סיסמה.
- באותו קטע, מפעילים את שיטת הכניסה קישור באימייל (כניסה ללא סיסמה).
- לוחצים על שמירה.
שליחת קישור אימות לכתובת האימייל של המשתמש
כדי להתחיל את תהליך האימות, מציגים למשתמש ממשק שבו הוא מתבקש לספק את כתובת האימייל שלו, ואז קוראים ל-sendSignInLink
כדי לבקש מ-Firebase לשלוח את קישור האימות לכתובת האימייל של המשתמש.
יוצרים את האובייקט
ActionCodeSettings
שמספק ל-Firebase הוראות ליצירת הקישור לאימייל. מגדירים את השדות הבאים:-
url
: קישור העומק להטמעה וכל מצב נוסף שרוצים להעביר. הדומיין של הקישור צריך להיכלל ברשימת הדומיינים המורשים במסוף Firebase. כדי לראות את הרשימה, עוברים לכרטיסייה 'שיטת כניסה' (אימות -> שיטת כניסה).
-
iOSBundleID
ו-androidPackageName
: עוזרים ל-Firebase Authentication לקבוע אם ליצור קישור לאינטרנט בלבד או קישור לנייד שנפתח במכשיר Android או Apple. -
handleCodeInApp
: מוגדר לערך true. פעולת הכניסה תמיד צריכה להסתיים באפליקציה, בניגוד לפעולות אחרות באימייל מחוץ לפס (איפוס סיסמה ואימותים באימייל). הסיבה לכך היא שבסוף התהליך, המשתמש אמור להיות מחובר והסטטוס של האימות שלו אמור להישמר באפליקציה. -
linkDomain
: כשמוגדרים דומיינים מותאמים אישית של קישורים לlinkDomain
פרויקט, מציינים באיזה דומיין להשתמש כשפותחים את הקישור באפליקציה ספציפית לנייד. אחרת, נבחר אוטומטית דומיין ברירת המחדל (לדוגמה, ).HostingPROJECT_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 Auth דורש לספק את כתובת האימייל של המשתמש כשמשלימים את תהליך ההתחברות. כדי שהכניסה תצליח, כתובת האימייל הזו צריכה להיות זהה לכתובת שאליה נשלח במקור קישור הכניסה.
כדי לייעל את התהליך הזה למשתמשים שפותחים את קישור הכניסה באותו מכשיר שבו הם מבקשים את הקישור, אפשר לאחסן את כתובת האימייל שלהם באופן מקומי כששולחים את האימייל לכניסה. לאחר מכן, משתמשים בכתובת הזו כדי להשלים את התהליך.
אחרי שהמשתמשים יסיימו את הכניסה, כל מנגנון כניסה קודם שלא אומת יוסר מהמשתמש, וכל הסשנים הקיימים יבוטלו. לדוגמה, אם מישהו יצר בעבר חשבון לא מאומת עם אותה כתובת אימייל וסיסמה, הסיסמה של המשתמש תוסר כדי למנוע מהמתחזה שטען לבעלות ויצר את החשבון הלא מאומת הזה להיכנס שוב עם אותו חשבון.
השלמת הכניסה באפליקציית 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
לפני Firebase Authentication iOS SDK v11.8.0, התכונה 'כניסה באמצעות קישור לאימייל' הסתמכה על 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; }
כדאי גם להוסיף קוד לטיפול בשגיאות עבור כל השגיאות שקשורות לאימות. מידע נוסף זמין במאמר בנושא טיפול בשגיאות.