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