התמדת מצב האימות

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

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

עם זאת, יש מקרים שבהם ההתנהגות הזו לא אידיאלית:

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

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

סוגי העקביות הנתמכים של מצב האימות

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

Enum ערך תיאור
firebase.auth.Auth.Persistence.LOCAL 'local' מציין שהמצב יישמר גם כשחלון הדפדפן ייסגר או שהפעילות תושמד ב-React Native. כדי לנקות את המצב הזה, צריך לצאת מהחשבון באופן מפורש. חשוב לזכור שסשנים באינטרנט של אימות Firebase הם ממקור מארח יחיד, והם יישמרו בדומיין אחד בלבד.
firebase.auth.Auth.Persistence.SESSION 'session' מציין שהמצב יישמר רק בסשן או בכרטיסייה הנוכחיים, ויימחק כשהכרטיסייה או החלון שבהם המשתמש אימת את עצמו ייסגרו. המאפיין רלוונטי רק לאפליקציות אינטרנט.
firebase.auth.Auth.Persistence.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;
  });

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

ברירת המחדל בדפדפני אינטרנט ובאפליקציות מקוריות היא 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 ובכל הכרטיסיות האחרות, המשתמש ינותק מהחשבון.