คุณสามารถระบุได้ว่าสถานะการตรวจสอบสิทธิ์ยังคงอยู่อย่างไรเมื่อใช้ 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
และบนแท็บอื่น ๆ ทั้งหมด ผู้ใช้ จะถูกออกจากระบบ