כשמשתמשים ב-Firebase JS SDK, אפשר לציין איך מצב האימות יישמר. ההגדרות האלה כוללות את היכולת לציין אם משתמש שמחובר לחשבון יישמר ללא הגבלת זמן עד ליציאה מפורשת מהחשבון, אם הוא יימחק כשהחלון ייסגר או אם הוא יימחק כשהדף יטען מחדש.
באפליקציית אינטרנט, ברירת המחדל היא לשמור את הסשן של המשתמש גם אחרי שהוא סוגר את הדפדפן. היתרון הוא שהמשתמש לא נדרש להיכנס כל פעם שהוא נכנס לדף האינטרנט באותו מכשיר. כתוצאה מכך, המשתמש יצטרך להזין מחדש את הסיסמה, לשלוח אימות ב-SMS וכו', מה שעלול להוסיף הרבה חיכוך לחוויית המשתמש.
עם זאת, יש מקרים שבהם ההתנהגות הזו לא אידיאלית:
- באפליקציות עם מידע רגיש, כדאי לנקות את המצב כשהחלון או הכרטיסייה נסגרים. זה חשוב למקרה שהמשתמש ישכח לצאת מהחשבון.
- אפליקציות שבהן משתמשים במכשיר שמשותף לכמה משתמשים. דוגמה נפוצה לכך היא אפליקציה שפועלת במחשב בספרייה.
- אפליקציה במכשיר משותף שיכול להיות לכמה משתמשים תהיה גישה אליה. המפתח לא יכול לדעת איך מתבצעת הגישה לאפליקציה הזו, ויכול להיות שהוא ירצה לתת למשתמש אפשרות לבחור אם לשמור את הסשן שלו או לא. אפשר לעשות זאת על ידי הוספת האפשרות 'זכור אותי' במהלך הכניסה.
- במקרים מסוימים, מפתחים עשויים לא לרצות לשמור משתמש אנונימי עד שהמשתמש הזה ישודרג לחשבון לא אנונימי (מאוחד, עם סיסמה, מספר טלפון וכו').
- מפתחים עשויים לרצות לאפשר למשתמשים שונים להיכנס לאפליקציה בכרטיסיות שונות. ברירת המחדל היא לשמור את המצב בכרטיסיות של אותו מקור.
כפי שצוין למעלה, יש כמה מצבים שבהם יכול להיות שיהיה צורך לשנות את ברירת המחדל של שימור קבוע.
סוגי העקביות הנתמכים של מצב האימות
אתם יכולים לבחור מתוך שלושה סוגים של עקביות של מצב אימות במכונה ספציפית של אימות ב-Firebase, בהתאם לדרישות של האפליקציה או המשתמש.
טיפוסים בני מנייה (enum) | ערך | תיאור |
---|---|---|
firebase.auth.Auth.Persistence.LOCAL |
'local' | מציין שהמצב יישמר גם כשחלון הדפדפן ייסגר או שהפעילות תושמד ב-React Native. כדי לנקות את המצב הזה, צריך לבצע יציאה מפורשת מהחשבון. חשוב לזכור שסשנים באינטרנט של אימות Firebase הם ממקור מארח יחיד, והם יישמרו בדומיין אחד בלבד. |
firebase.auth.Auth.Persistence.SESSION |
'session' | מציין שהמצב יישמר רק בסשן או בכרטיסייה הנוכחיים, ויימחק כשהכרטיסייה או החלון שבהם המשתמש אימת את עצמו ייסגרו. רלוונטי רק לאפליקציות אינטרנט. |
firebase.auth.Auth.Persistence.NONE |
'none' | מציין שהמצב יישמר בזיכרון בלבד ויימחק כשהחלון או הפעילות יתעדכנו. |
שינוי העקביות של מצב האימות
אפשר לציין או לשנות את סוג השמירה הקבועה הקיים על ידי קריאה ל-method firebase.auth().setPersistence
:
Web
import { getAuth, setPersistence, signInWithEmailAndPassword, browserSessionPersistence } from "firebase/auth"; const auth = getAuth(); setPersistence(auth, browserSessionPersistence) .then(() => { // Existing and future Auth states are now persisted in the current // session only. Closing the window would clear any existing state even // if a user forgets to sign out. // ... // New sign-in will be persisted with session persistence. return signInWithEmailAndPassword(auth, email, password); }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; });
Web
firebase.auth().setPersistence(firebase.auth.Auth.Persistence.SESSION) .then(() => { // Existing and future Auth states are now persisted in the current // session only. Closing the window would clear any existing state even // if a user forgets to sign out. // ... // New sign-in will be persisted with session persistence. return firebase.auth().signInWithEmailAndPassword(email, password); }) .catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; });
הפעולה הזו תשנה את סוג העקביות במכונה המפורטת של אימות הסשן הנוכחי של אימות הזהות, ותחיל את סוג העקביות הזה על בקשות כניסה עתידיות, כולל בקשות כניסה עם הפניה אוטומטית. הפונקציה הזו תחזיר הבטחה שתתבצע כשהעתקת המצב מסוג האחסון אחד לסוג השני תסתיים. קריאה לשיטת כניסה אחרי שינוי של שימור הנתונים תמתין עד שהשינוי של שימור הנתונים יושלם, ואז תחיל אותו על מצב האימות החדש.
ברירת המחדל לדפדפני אינטרנט ולאפליקציות React Native היא local
(בתנאי שהדפדפן תומך במנגנון האחסון הזה, למשל קובצי cookie או נתונים של צד שלישי מופעלים), ואילו הוא none
באפליקציות לקצה העורפי של Node.js.
סקירה כללית על התנהגות עקביות
הקריטריונים הבאים יחולו כדי לקבוע את המצב הנוכחי של הקביעות.
- בשלב הראשון, ה-SDK יבדוק אם קיים משתמש מאומת. אם לא תתבצע קריאה ל-
setPersistence
, סוג השמירה הנוכחי של המשתמש יחול על ניסיונות כניסה עתידיים. לכן, אם המשתמש הזה נשמר ב-session
בדף אינטרנט קודם ונכנסתם לדף חדש, כשתתחברו שוב עם משתמש אחר, המצב של המשתמש הזה יישמר גם הוא באמצעות שימור ב-session
. - אם אף משתמש לא מחובר ולא צוין ערך שיישמר, תתבצע החלה של הגדרת ברירת המחדל (
local
באפליקציית דפדפן). - אם אף משתמש לא נכנס לחשבון והוגדר סוג חדש של עקביות, כל ניסיון כניסה עתידי ישתמש בסוג העקביות הזה.
- אם המשתמש מחובר וסוג השמירה משתנה, השמירה של המשתמש המחובר תשתנה לסוג החדש. כל ניסיונות הכניסה העתידיים ישתמשו בסטטוס העמידה בפני מחיקה החדש.
כשמתבצעת קריאה ל-signInWithRedirect, סוג השמירה הנוכחי נשמר ומוחיל בסוף תהליך ה-OAuth על המשתמש שנכנס לחשבון, גם אם סוג השמירה היה
none
. אם העמידה בסטטוס תצוין במפורש בדף הזה, היא תגבר על העמידה בסטטוס האימות שנשמר מהדף הקודם שהתחיל את תהליך ההפניה האוטומטית.Web
import { getAuth, setPersistence, signInWithRedirect, inMemoryPersistence, GoogleAuthProvider } from "firebase/auth"; const auth = getAuth(); setPersistence(auth, inMemoryPersistence) .then(() => { const provider = new GoogleAuthProvider(); // In memory persistence will be applied to the signed in Google user // even though the persistence was set to 'none' and a page redirect // occurred. return signInWithRedirect(auth, provider); }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; });
Web
firebase.auth().setPersistence(firebase.auth.Auth.Persistence.NONE) .then(() => { var provider = new firebase.auth.GoogleAuthProvider(); // In memory persistence will be applied to the signed in Google user // even though the persistence was set to 'none' and a page redirect // occurred. return firebase.auth().signInWithRedirect(provider); }) .catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; });
התנהגות צפויה בכרטיסיות בדפדפן
ההתנהגות הצפויה הבאה תחול כשמשתמשים בסוגים שונים של עמידות בכרטיסיות שונות. הדרישה היא שלעולם לא יהיו כמה סוגים של מצבים שמורים בו-זמנית (למשל, מצב אימות שנשמר בסוגים session
ו-local
של אחסון):
- משתמשים יכולים להיכנס באמצעות שימוש מתמשך ב-
session
או ב-none
עם משתמשים שונים בכמה כרטיסיות. כל כרטיסייה לא יכולה לראות את המצב של הכרטיסייה השנייה. - כל ניסיון כניסה באמצעות התכונה
local
יתגלה ויסתנכרן בכל הכרטיסיות. אם המשתמש נכנס בעבר לכרטיסייה ספציפית באמצעות שימוש ב-session
או ב-none
, המצב הזה יימחק. - אם המשתמש נכנס לחשבון בעבר באמצעות שמירת המצב של
local
עם כמה כרטיסיות פתוחות, ולאחר מכן עובר לשמירת המצב שלnone
אוsession
בכרטיסייה אחת, המצב של הכרטיסייה הזו ישתנה והמשתמש יישמר ב-session
או ב-none
, ובכל הכרטיסיות האחרות המשתמש יתנתק.