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

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

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

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

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

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

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

סוגים נתמכים של התמדה במדינת אישור

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

Enum ערך תיאור
firebase.auth.Auth.Persistence.LOCAL 'מְקוֹמִי' מציין שהמצב יימשך גם כאשר חלון הדפדפן ייסגר או שהפעילות תושמד ב-React Native. יש צורך ביציאה מפורשת כדי לנקות את המצב הזה. שים לב שההפעלות האינטרנט של Firebase Auth הן מקור מארח יחיד והן ימשיכו לדומיין בודד בלבד.
firebase.auth.Auth.Persistence.SESSION 'מוֹשָׁב' מציין שהמצב יימשך רק בהפעלה או בכרטיסייה הנוכחית, וינוקה כשהכרטיסייה או החלון שבהם המשתמש אומת ייסגר. חל רק על אפליקציות אינטרנט.
firebase.auth.Auth.Persistence.NONE 'אף אחד' מציין שהמצב יישמר רק בזיכרון וינוקה כאשר החלון או הפעילות יתחדשו.

שינוי התמדה של מדינת האישור

אתה יכול לציין או לשנות את סוג ההתמדה הקיים על ידי קריאה לשיטת firebase.auth().setPersistence :

Web version 9

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 version 8

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 version 9

    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 version 8

    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 או none ובכל הכרטיסיות האחרות session המשתמש ייצא.