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

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

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

อย่างไรก็ตาม ในบางกรณีพฤติกรรมนี้อาจไม่เหมาะสม

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

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

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

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

ค่าแจกแจง ค่า คำอธิบาย
firebase.auth.Auth.Persistence.LOCAL "local" ระบุว่าสถานะจะยังคงเดิมแม้ว่าหน้าต่างเบราว์เซอร์จะเปิดอยู่ ปิดหรือกิจกรรมถูกทำลายใน React Native การออกจากระบบอย่างชัดแจ้ง เพื่อล้างสถานะดังกล่าว โปรดทราบว่าเซสชันเว็บการตรวจสอบสิทธิ์ Firebase ต้นทางของโฮสต์เดียวและจะยังคงอยู่สำหรับโดเมนเดียวเท่านั้น
firebase.auth.Auth.Persistence.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;
  });

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

ค่าเริ่มต้นสำหรับเว็บเบราว์เซอร์และแอป React เนทีฟคือ local (หากกำหนดค่า เบราว์เซอร์รองรับกลไกการเก็บข้อมูลนี้ เช่น เปิดใช้งานคุกกี้/ข้อมูลของบุคคลที่สาม) ในขณะที่คือ 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 และแท็บอื่นๆ ทั้งหมด ผู้ใช้จะออกจากระบบ