ความต่อเนื่องของสถานะการตรวจสอบสิทธิ์

คุณสามารถระบุวิธีเก็บสถานะการตรวจสอบสิทธิ์ไว้ได้เมื่อใช้ Firebase JS SDK ซึ่งรวมถึงความสามารถในการระบุว่าผู้ใช้ที่ลงชื่อเข้าใช้ควรอยู่ในระบบต่อไปอย่างไม่มีกำหนดจนกว่าจะออกจากระบบอย่างชัดเจน ล้างออกเมื่อปิดหน้าต่าง หรือล้างออกเมื่อโหลดหน้าเว็บซ้ำหรือไม่

สําหรับเว็บแอปพลิเคชัน ลักษณะการทํางานเริ่มต้นคือการคงเซสชันของผู้ใช้ไว้แม้ว่าผู้ใช้จะปิดเบราว์เซอร์แล้วก็ตาม ซึ่งสะดวกเนื่องจากผู้ใช้ไม่จําเป็นต้องลงชื่อเข้าใช้อย่างต่อเนื่องทุกครั้งที่เข้าชมหน้าเว็บในอุปกรณ์เครื่องเดียวกัน ซึ่งอาจทำให้ผู้ใช้ต้องป้อนรหัสผ่านอีกครั้ง ส่งการยืนยันทาง SMS ฯลฯ ซึ่งอาจทำให้ประสบการณ์ของผู้ใช้แย่ลง

อย่างไรก็ตาม อาจมีบางกรณีที่ลักษณะการทํางานนี้อาจไม่เหมาะ

  • แอปพลิเคชันที่มีข้อมูลที่ละเอียดอ่อนอาจต้องการล้างสถานะเมื่อปิดหน้าต่างหรือแท็บ ซึ่งสำคัญในกรณีที่ผู้ใช้ลืมออกจากระบบ
  • แอปพลิเคชันที่ใช้ในอุปกรณ์ที่ผู้ใช้หลายคนแชร์ ตัวอย่างที่พบบ่อยคือแอปที่ทำงานในคอมพิวเตอร์ห้องสมุด
  • แอปพลิเคชันในอุปกรณ์ที่แชร์ซึ่งผู้ใช้หลายคนอาจเข้าถึงได้ นักพัฒนาแอปไม่สามารถบอกได้ว่าแอปพลิเคชันนั้นเข้าถึงด้วยวิธีใด และอาจต้องการอนุญาตให้ผู้ใช้เลือกว่าจะเก็บเซสชันไว้หรือไม่ ซึ่งทำได้โดยการเพิ่มตัวเลือก "จำฉันไว้" ในระหว่างการลงชื่อเข้าใช้
  • ในบางกรณี นักพัฒนาแอปอาจไม่ต้องการเก็บผู้ใช้ที่ไม่ระบุชื่อไว้จนกว่าผู้ใช้รายนั้นจะอัปเกรดเป็นบัญชีที่ระบุชื่อ (รวมศูนย์ รหัสผ่าน โทรศัพท์ ฯลฯ)
  • นักพัฒนาแอปอาจต้องการอนุญาตให้ผู้ใช้รายอื่นลงชื่อเข้าใช้แอปพลิเคชันในแท็บต่างๆ ได้ ลักษณะการทำงานเริ่มต้นคือการคงสถานะไว้สำหรับแท็บต่างๆ ของต้นทางเดียวกัน

ดังที่กล่าวไว้ข้างต้น มีหลายกรณีที่อาจต้องลบล้างการคงอยู่แบบถาวรเริ่มต้น

ประเภทสถานะการเข้าสู่ระบบแบบถาวรที่รองรับ

คุณเลือกสถานะการคงอยู่ของ Auth ประเภทใดประเภทหนึ่งใน 3 ประเภทในอินสแตนซ์ Firebase Auth ที่ระบุได้ตามข้อกําหนดของแอปพลิเคชันหรือผู้ใช้

ค่าแจกแจง ค่า คำอธิบาย
firebase.auth.Auth.Persistence.LOCAL 'local' บ่งบอกว่าสถานะจะยังคงอยู่แม้ว่าหน้าต่างเบราว์เซอร์จะปิดหรือกิจกรรมถูกทำลายใน React Native คุณต้องออกจากระบบอย่างชัดเจนเพื่อล้างสถานะดังกล่าว โปรดทราบว่าเซสชันเว็บของ Firebase Auth เป็นแหล่งที่มาของโฮสต์เดียวและจะคงอยู่สำหรับโดเมนเดียวเท่านั้น
firebase.auth.Auth.Persistence.SESSION 'session' บ่งบอกว่าสถานะจะคงอยู่ในเซสชันหรือแท็บปัจจุบันเท่านั้น และจะล้างออกเมื่อปิดแท็บหรือหน้าต่างที่ผู้ใช้ตรวจสอบสิทธิ์ ใช้กับเว็บแอปเท่านั้น
firebase.auth.Auth.Persistence.NONE 'none' บ่งชี้ว่าระบบจะจัดเก็บสถานะไว้ในหน่วยความจําเท่านั้น และจะล้างออกเมื่อมีการรีเฟรชหน้าต่างหรือกิจกรรม

การแก้ไขการคงสถานะการตรวจสอบสิทธิ์

คุณสามารถระบุหรือแก้ไขประเภทการคงอยู่ที่มีอยู่ได้โดยเรียกใช้เมธอด 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;
  });

ซึ่งจะเปลี่ยนประเภทของการเก็บรักษาในอินสแตนซ์ Auth ที่ระบุสำหรับเซสชัน Auth ที่บันทึกไว้ในปัจจุบัน และใช้การเก็บรักษาประเภทนี้กับคำขอลงชื่อเข้าใช้ในอนาคต รวมถึงการลงชื่อเข้าใช้ด้วยคำขอเปลี่ยนเส้นทาง ซึ่งจะแสดงผลลัพธ์เป็นสัญญาว่าจะดำเนินการเมื่อสถานะคัดลอกจากพื้นที่เก็บข้อมูลประเภทหนึ่งไปยังอีกประเภทหนึ่งเสร็จสมบูรณ์ การเรียกใช้เมธอดการลงชื่อเข้าใช้หลังจากเปลี่ยนการคงสถานะจะรอให้การเปลี่ยนแปลงการคงสถานะเสร็จสมบูรณ์ก่อนนำไปใช้กับสถานะการตรวจสอบสิทธิ์ใหม่

ค่าเริ่มต้นสำหรับเว็บเบราว์เซอร์และแอป React Native คือ local (ในกรณีที่เบราว์เซอร์รองรับกลไกการจัดเก็บนี้ เช่น คุกกี้/ข้อมูลของบุคคลที่สามเปิดใช้อยู่) ในขณะที่ค่าสำหรับแอปแบ็กเอนด์ Node.js คือ none

ภาพรวมของลักษณะการคงอยู่

ระบบจะใช้เกณฑ์ต่อไปนี้เมื่อพิจารณาสถานะปัจจุบันของการเก็บรักษา

  • ในขั้นต้น SDK จะตรวจสอบว่ามีผู้ใช้ที่ตรวจสอบสิทธิ์แล้วหรือไม่ เว้นแต่จะมีการเรียกใช้ setPersistence ระบบจะใช้ประเภทการคงสถานะปัจจุบันของผู้ใช้นั้นสำหรับการพยายามลงชื่อเข้าใช้ในอนาคต ดังนั้นหากผู้ใช้รายนั้นยังคงอยู่ใน session ในหน้าเว็บก่อนหน้าและมีการไปที่หน้าใหม่ การลงชื่อเข้าใช้อีกครั้งด้วยผู้ใช้รายอื่นจะส่งผลให้ระบบบันทึกสถานะของผู้ใช้รายนั้นด้วย session Persist
  • หากไม่มีผู้ใช้ที่ลงชื่อเข้าใช้และไม่มีการระบุการคงสถานะไว้ ระบบจะใช้การตั้งค่าเริ่มต้น (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 และในแท็บอื่นๆ ทั้งหมด ระบบจะออกจากระบบของผู้ใช้