ความคงอยู่ของรัฐการรับรองความถูกต้อง

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

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

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

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

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

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

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

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

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

คุณสามารถระบุหรือแก้ไขประเภทการคงอยู่ที่มีอยู่ได้โดยการเรียกเมธอด firebase.auth().setPersistence :

Web modular API

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 namespaced API

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

ภาพรวมของพฤติกรรมการคงอยู่

เกณฑ์ต่อไปนี้จะถูกนำไปใช้ในการพิจารณาสถานะปัจจุบันของการคงอยู่

  • ในตอนแรก SDK จะตรวจสอบว่ามีผู้ใช้ที่ได้รับการรับรองความถูกต้องหรือไม่ เว้นแต่จะเรียก setPersistence ประเภทการคงอยู่ปัจจุบันของผู้ใช้นั้นจะถูกนำไปใช้กับการพยายามลงชื่อเข้าใช้ในอนาคต ดังนั้น หากผู้ใช้รายนั้นยังคงอยู่ใน session บนหน้าเว็บก่อนหน้าและมีการเยี่ยมชมหน้าใหม่ การลงชื่อเข้าใช้อีกครั้งด้วยผู้ใช้รายอื่นจะส่งผลให้สถานะของผู้ใช้นั้นได้รับการบันทึกด้วยความคงอยู่ของ session ด้วย
  • หากไม่มีผู้ใช้ลงชื่อเข้าใช้และไม่ได้ระบุความคงอยู่ ระบบจะใช้การตั้งค่าเริ่มต้น (ใน local ในแอปเบราว์เซอร์)
  • หากไม่มีผู้ใช้ลงชื่อเข้าใช้และมีการตั้งค่าการคงอยู่ประเภทใหม่ ความพยายามในการลงชื่อเข้าใช้ในอนาคตจะใช้การคงอยู่ประเภทนั้น
  • หากผู้ใช้ลงชื่อเข้าใช้และมีการแก้ไขประเภทการคงอยู่ ผู้ใช้ที่ลงชื่อเข้าใช้ที่มีอยู่จะเปลี่ยนการคงอยู่เป็นผู้ใช้ใหม่ ความพยายามในการลงชื่อเข้าใช้ในอนาคตทั้งหมดจะใช้ความคงอยู่ใหม่นั้น
  • เมื่อเรียก signInWithRedirect ประเภทการคงอยู่ปัจจุบันจะคงอยู่และนำไปใช้เมื่อสิ้นสุดโฟลว์ OAuth กับผู้ใช้ที่ลงชื่อเข้าใช้ใหม่ แม้ว่าการคงอยู่นั้นจะ none ก็ตาม หากมีการระบุการคงอยู่ไว้อย่างชัดเจนในหน้านั้น การคงอยู่นั้นจะแทนที่การคงอยู่ของสถานะการตรวจสอบสิทธิ์ที่เก็บไว้จากหน้าก่อนหน้าที่เริ่มโฟลว์การเปลี่ยนเส้นทาง

    Web modular API

    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 namespaced API

    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 และบนแท็บอื่น ๆ ทั้งหมด ผู้ใช้ จะถูกออกจากระบบ