אתם יכולים להשתמש ב-Firebase Authentication כדי להחתים משתמש על ידי שליחת אימייל עם קישור, שאפשר ללחוץ עליו כדי להיכנס לחשבון. במהלך התהליך, כתובת האימייל של המשתמש מאומתת.
יש הרבה יתרונות לכניסה באמצעות אימייל:
- הרשמה וכניסה פשוטות.
- הסיכון לשימוש חוזר בסיסמאות באפליקציות שונות נמוך יותר, מה שיכול לפגוע באבטחה של סיסמאות שנבחרו בקפידה.
- היכולת לאמת משתמש וגם לוודא שהוא הבעלים הלגיטימי של כתובת אימייל.
- משתמשים צריכים רק חשבון אימייל נגיש כדי להיכנס. לא נדרשת בעלות על מספר טלפון או על חשבון במדיה החברתית.
- משתמש יכול להיכנס לחשבון בצורה מאובטחת בלי לספק (או לזכור) סיסמה, מה שיכול להיות מסורבל במכשיר נייד.
- משתמש קיים שנכנס בעבר באמצעות מזהה אימייל (סיסמה או איחוד) יכול לשדרג את הכניסה שלו כך שתתבצע רק באמצעות האימייל. לדוגמה, משתמש ששכח את הסיסמה שלו עדיין יכול להיכנס לחשבון בלי לאפס את הסיסמה.
לפני שמתחילים
הגדרת פרויקט Android
אם עדיין לא עשיתם זאת, עליכם להוסיף את Firebase לפרויקט Android שלכם.
בקובץ Gradle של המודול (ברמת האפליקציה) (בדרך כלל
<project>/<app-module>/build.gradle.kts
או<project>/<app-module>/build.gradle
), מוסיפים את התלות בספריית Firebase Authentication ל-Android. מומלץ להשתמש ב-Firebase Android BoM כדי לשלוט בניהול הגרסאות של הספריות.בנוסף, במסגרת ההגדרה של Firebase Authentication, צריך להוסיף את Google Play services SDK לאפליקציה.
dependencies { // Import the BoM for the Firebase platform implementation(platform("com.google.firebase:firebase-bom:34.0.0")) // Add the dependency for the Firebase Authentication library // When using the BoM, you don't specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.0") }באמצעות Firebase Android BoM, האפליקציה תמיד תשתמש בגרסאות תואמות של ספריות Firebase ל-Android.
(חלופה) מוסיפים תלויות של ספריות Firebase בלי להשתמש ב-BoM
אם לא משתמשים ב-Firebase BoM, צריך לציין את הגרסה של כל ספריית Firebase בשורת התלות שלה.
הערה: אם אתם משתמשים בכמה ספריות Firebase באפליקציה, מומלץ מאוד להשתמש ב-BoM כדי לנהל את גרסאות הספריות, וכך לוודא שכל הגרסאות תואמות.
dependencies { // Add the dependency for the Firebase Authentication library // When NOT using the BoM, you must specify versions in Firebase library dependencies implementation("com.google.firebase:firebase-auth:24.0.0")
// Also add the dependency for the Google Play services library and specify its version implementation("com.google.android.gms:play-services-auth:21.3.0") }
הפעלת התחברות באמצעות קישור באימייל בפרויקט Firebase
כדי לאפשר למשתמשים להיכנס באמצעות קישור באימייל, קודם צריך להפעיל את ספק האימייל ואת שיטת הכניסה באמצעות קישור באימייל בפרויקט Firebase:
- במסוף Firebase, פותחים את הקטע אימות.
- בכרטיסייה שיטת הכניסה, מפעילים את ספק האימייל/הסיסמה. הערה כדי להשתמש בכניסה באמצעות קישור באימייל, צריך להפעיל כניסה באמצעות כתובת אימייל או סיסמה.
- באותו קטע, מפעילים את שיטת הכניסה קישור באימייל (כניסה ללא סיסמה).
- לוחצים על שמירה.
שליחת קישור אימות לכתובת האימייל של המשתמש
כדי להתחיל את תהליך האימות, מציגים למשתמש ממשק שבו הוא מתבקש לספק את כתובת האימייל שלו, ואז קוראים ל-sendSignInLinkToEmail
כדי לבקש מ-Firebase לשלוח את קישור האימות לכתובת האימייל של המשתמש.
יוצרים את האובייקט ActionCodeSettings, שמספק ל-Firebase הוראות ליצירת הקישור לאימייל. מגדירים את השדות הבאים:
-
url
: קישור העומק להטמעה וכל מצב נוסף שרוצים להעביר. הדומיין של הקישור צריך להיכלל ברשימת הדומיינים המורשים במסוף Firebase. כדי לראות את הרשימה, עוברים לכרטיסייה 'שיטת כניסה' (אימות -> שיטת כניסה). אם האפליקציה לא מותקנת במכשיר של המשתמש ולא ניתן להתקין אותה, הקישור יפנה את המשתמש לכתובת ה-URL הזו.
-
androidPackageName
ו-iOSBundleId
: עוזרים ל-Firebase Authentication לקבוע אם ליצור קישור לאינטרנט בלבד או קישור לנייד שנפתח במכשיר Android או Apple. -
handleCodeInApp
: מוגדר לערך true. פעולת הכניסה תמיד צריכה להסתיים באפליקציה, בניגוד לפעולות אחרות באימייל מחוץ לפס (איפוס סיסמה ואימותים באימייל). הסיבה לכך היא שבסוף התהליך, המשתמש אמור להיות מחובר והסטטוס של האימות שלו אמור להישמר באפליקציה. -
linkDomain
: כשמוגדרים דומיינים מותאמים אישית של קישורים לפרויקט, צריך לציין באיזה מהם להשתמש כשפותחים את הקישור באפליקציה ספציפית לנייד. אחרת, הדומיין שמוגדר כברירת מחדל נבחר באופן אוטומטי (לדוגמה, ).HostingPROJECT_ID.firebaseapp.com
-
dynamicLinkDomain
: הוצא משימוש. לא מציינים את הפרמטר הזה.
val actionCodeSettings = 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 setIOSBundleId("com.example.ios") setAndroidPackageName( "com.example.android", true, // installIfNotAvailable "12", // minimumVersion ) }
ActionCodeSettings actionCodeSettings = ActionCodeSettings.newBuilder() // URL you want to redirect back to. The domain (www.example.com) for this // URL must be whitelisted in the Firebase Console. .setUrl("https://www.example.com/finishSignUp?cartId=1234") // This must be true .setHandleCodeInApp(true) .setIOSBundleId("com.example.ios") .setAndroidPackageName( "com.example.android", true, /* installIfNotAvailable */ "12" /* minimumVersion */) .build();
מידע נוסף על ActionCodeSettings זמין בקטע העברת מצב בפעולות באימייל.
-
מבקשים מהמשתמש את כתובת האימייל שלו.
שולחים את קישור האימות לאימייל של המשתמש ושומרים את כתובת האימייל של המשתמש למקרה שהמשתמש ישלים את הכניסה באמצעות האימייל באותו מכשיר.
Firebase.auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Email sent.") } }
FirebaseAuth auth = FirebaseAuth.getInstance(); auth.sendSignInLinkToEmail(email, actionCodeSettings) .addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { Log.d(TAG, "Email sent."); } } });
השלמת הכניסה באמצעות הקישור באימייל
חששות לגבי אבטחה
כדי למנוע שימוש בקישור לכניסה לחשבון לצורך כניסה כמשתמש לא רצוי או במכשיר לא רצוי, Firebase Authentication דורשת לספק את כתובת האימייל של המשתמש כשמשלימים את תהליך הכניסה. כדי שהכניסה תצליח, כתובת האימייל הזו צריכה להיות זהה לכתובת שאליה נשלח במקור קישור הכניסה.
כדי לייעל את התהליך הזה למשתמשים שפותחים את קישור הכניסה באותו מכשיר שבו הם מבקשים את הקישור, אפשר לאחסן את כתובת האימייל שלהם באופן מקומי – למשל באמצעות SharedPreferences – כששולחים את האימייל לכניסה. אחר כך, משתמשים בכתובת הזו כדי להשלים את התהליך. אל תעבירו את כתובת האימייל של המשתמש בפרמטרים של כתובת ה-URL להפניה או תשתמשו בה מחדש, כי זה עלול לאפשר הזרקות לסשן.
אחרי שהמשתמשים יסיימו את הכניסה, כל מנגנון כניסה קודם שלא אומת יוסר מהמשתמש, וכל הסשנים הקיימים יבוטלו. לדוגמה, אם מישהו יצר בעבר חשבון לא מאומת עם אותה כתובת אימייל ואותה סיסמה, הסיסמה של המשתמש תוסר כדי למנוע מהמתחזה שטען לבעלות על החשבון הלא מאומת הזה ויצר אותו להיכנס שוב באמצעות כתובת האימייל והסיסמה הלא מאומתות.
בנוסף, חשוב לוודא שמשתמשים בכתובת URL עם HTTPS בסביבת הייצור כדי למנוע מצב שבו שרתים מתווכים עלולים ליירט את הקישור.
השלמת הכניסה באפליקציית Android
ארגון Firebase Authentication משתמש באפליקציה Firebase Hosting כדי לשלוח את הקישור באימייל למכשיר נייד. כדי להשלים את הכניסה דרך אפליקציה לנייד, צריך להגדיר את האפליקציה כך שתזהה את קישור האפליקציה הנכנס, תנתח את קישור העומק הבסיסי ואז תשלים את הכניסה. מידע נוסף זמין במאמרי העזרה בנושא קישורים לאפליקציות ל-Android.
הגדרה של Firebase Hosting
Firebase Authentication משתמש בדומיינים של Firebase Hosting כשיוצרים ושולחים קישור שנועד להיפתח באפליקציה לנייד. כבר הגדרנו בשבילכם Firebase Hostingדומיין ברירת מחדל.
הגדרת דומיינים של Firebase Hosting:
במסוף Firebase, פותחים את הקטע אירוח.
אם רוצים להשתמש בדומיין שמוגדר כברירת מחדל לקישור לאימייל שנפתח באפליקציות לנייד, צריך לעבור לאתר שמוגדר כברירת מחדל ולרשום את הדומיין שמוגדר כברירת מחדל Hosting. דומיין ברירת מחדל Hosting בדרך כלל נראה כך:
.PROJECT_ID.firebaseapp.com
תצטרכו את הערך הזה כשמגדירים את האפליקציה ליירוט הקישור הנכנס.
אם אתם רוצים להשתמש בדומיין מותאם אישית לקישור לאימייל, אתם יכולים להירשם לדומיין באמצעות Firebase Hosting ולהשתמש בו כדומיין של הקישור.
הגדרת אפליקציות ל-Android:
כדי לטפל בקישורים האלה מאפליקציית Android, צריך לציין את שם החבילה של האפליקציה בהגדרות הפרויקט במסוף Firebase. בנוסף, צריך לספק את SHA-1 ו-SHA-256 של אישור האפליקציה.
אם רוצים שהקישורים האלה יפנו לפעילות ספציפית, צריך להגדיר מסנן כוונות בקובץ
AndroidManifest.xml
. מסנן הכוונות צריך לזהות קישורים לאימיילים של הדומיין שלכם. ב-AndroidManifest.xml
:<intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.BROWSABLE" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="https" android:host="<PROJECT_ID>.firebaseapp.com or your custom domain" android:pathPrefix="/__/auth/links" /> </intent-filter>
כשמשתמשים פותחים קישור לאירוח עם הנתיב
/__/auth/links
והסכימה והמארח שציינתם, האפליקציה שלכם תתחיל את הפעילות עם מסנן הכוונות הזה כדי לטפל בקישור.
אימות הקישור וכניסה
אחרי שתקבלו את הקישור כמו שמתואר למעלה, תצטרכו לוודא שהוא מיועד לאימות קישור באימייל ולהשלים את הכניסה לחשבון.
val auth = Firebase.auth val intent = intent val emailLink = intent.data.toString() // Confirm the link is a sign-in with email link. if (auth.isSignInWithEmailLink(emailLink)) { // Retrieve this from wherever you stored it val email = "someemail@domain.com" // The client SDK will parse the code from the link for you. auth.signInWithEmailLink(email, emailLink) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Successfully signed in with email link!") val result = task.result // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error signing in with email link", task.exception) } } }
FirebaseAuth auth = FirebaseAuth.getInstance(); Intent intent = getIntent(); String emailLink = intent.getData().toString(); // Confirm the link is a sign-in with email link. if (auth.isSignInWithEmailLink(emailLink)) { // Retrieve this from wherever you stored it String email = "someemail@domain.com"; // The client SDK will parse the code from the link for you. auth.signInWithEmailLink(email, emailLink) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "Successfully signed in with email link!"); AuthResult result = task.getResult(); // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error signing in with email link", task.getException()); } } }); }
מידע נוסף על טיפול בכניסה באמצעות קישור באימייל באפליקציית Apple זמין במדריך לפלטפורמות של Apple.
במדריך לאינטרנט מוסבר איך לטפל בכניסה באמצעות קישור באימייל באפליקציית אינטרנט.
קישור או אימות מחדש באמצעות קישור באימייל
אפשר גם לקשר את שיטת האימות הזו למשתמש קיים. לדוגמה, משתמש שאומת בעבר באמצעות ספק אחר, כמו מספר טלפון, יכול להוסיף את שיטת הכניסה הזו לחשבון הקיים שלו.
ההבדל יהיה במחצית השנייה של הפעולה:
// Construct the email link credential from the current URL. val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink) // Link the credential to the current user. Firebase.auth.currentUser!!.linkWithCredential(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { Log.d(TAG, "Successfully linked emailLink credential!") val result = task.result // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error linking emailLink credential", task.exception) } }
// Construct the email link credential from the current URL. AuthCredential credential = EmailAuthProvider.getCredentialWithLink(email, emailLink); // Link the credential to the current user. auth.getCurrentUser().linkWithCredential(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { Log.d(TAG, "Successfully linked emailLink credential!"); AuthResult result = task.getResult(); // You can access the new user via result.getUser() // Additional user info profile *not* available via: // result.getAdditionalUserInfo().getProfile() == null // You can check if the user is new or existing: // result.getAdditionalUserInfo().isNewUser() } else { Log.e(TAG, "Error linking emailLink credential", task.getException()); } } });
אפשר להשתמש בזה גם כדי לאמת מחדש משתמש עם קישור באימייל לפני שמריצים פעולה רגישה.
// Construct the email link credential from the current URL. val credential = EmailAuthProvider.getCredentialWithLink(email, emailLink) // Re-authenticate the user with this credential. Firebase.auth.currentUser!!.reauthenticateAndRetrieveData(credential) .addOnCompleteListener { task -> if (task.isSuccessful) { // User is now successfully reauthenticated } else { Log.e(TAG, "Error reauthenticating", task.exception) } }
// Construct the email link credential from the current URL. AuthCredential credential = EmailAuthProvider.getCredentialWithLink(email, emailLink); // Re-authenticate the user with this credential. auth.getCurrentUser().reauthenticateAndRetrieveData(credential) .addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { if (task.isSuccessful()) { // User is now successfully reauthenticated } else { Log.e(TAG, "Error reauthenticating", task.getException()); } } });
עם זאת, יכול להיות שהתהליך יסתיים במכשיר אחר שבו המשתמש המקורי לא היה מחובר, ולכן יכול להיות שהתהליך לא יושלם. במקרה כזה, יכול להיות שתוצג למשתמש שגיאה כדי לאלץ אותו לפתוח את הקישור באותו מכשיר. אפשר להעביר חלק מהמצב בקישור כדי לספק מידע על סוג הפעולה ועל מזהה המשתמש.
הוצא משימוש: אימות על סמך Firebase Dynamic Links
בעבר, אימות באמצעות קישור באימייל הסתמך על Firebase Dynamic Links, שייצא משימוש ב-25 באוגוסט 2025.
פרסמנו פתרון חלופי ב-Firebase Authentication Android SDK v23.2.0+ וב-Firebase BoM v33.9.0+.
אם האפליקציה שלכם משתמשת בקישורים בסגנון הישן, אתם צריכים להעביר את האפליקציה למערכת החדשה שמבוססת על Firebase Hosting.
הוצאה משימוש: הבחנה בין אימייל וסיסמה לבין קישור באימייל
אם יצרתם את הפרויקט ב-15 בספטמבר 2023 או אחריו, ההגנה מפני ספירת כתובות אימייל מופעלת כברירת מחדל. התכונה הזו משפרת את האבטחה של חשבונות המשתמשים בפרויקט, אבל היא משביתה את השיטה fetchSignInMethodsForEmail()
, שבעבר המלצנו להשתמש בה כדי להטמיע תהליכי זיהוי שמתחילים עם מזהה.
אפשר להשבית את ההגנה מפני ספירת כתובות אימייל בפרויקט, אבל אנחנו לא ממליצים לעשות את זה.
פרטים נוספים זמינים במאמר בנושא הגנה מפני ספירת כתובות אימייל.
השלבים הבאים
אחרי שהמשתמש נכנס לחשבון בפעם הראשונה, נוצר חשבון משתמש חדש שמקושר לפרטי הכניסה – כלומר, שם המשתמש והסיסמה, מספר הטלפון או פרטי ספק האימות – שבאמצעותם המשתמש נכנס לחשבון. החשבון החדש הזה נשמר כחלק מפרויקט Firebase, ואפשר להשתמש בו כדי לזהות משתמש בכל האפליקציות בפרויקט, בלי קשר לשיטת הכניסה של המשתמש.
-
באפליקציות שלכם, תוכלו לקבל את פרטי הפרופיל הבסיסיים של המשתמש מאובייקט
FirebaseUser
. ניהול משתמשים בFirebase Realtime Database ובCloud Storage כללי האבטחה, אפשר לקבל את מזהה המשתמש הייחודי של המשתמש המחובר מהמשתנה
auth
, ולהשתמש בו כדי לקבוע לאילו נתונים המשתמש יכול לגשת.
אתם יכולים לאפשר למשתמשים להיכנס לאפליקציה שלכם באמצעות כמה ספקי אימות על ידי קישור פרטי כניסה של ספק אימות לחשבון משתמש קיים.
כדי להוציא משתמש מהחשבון, מתקשרים אל
signOut
:
Firebase.auth.signOut()
FirebaseAuth.getInstance().signOut();