การออกจากระบบ (Sign-out)
การออกจากระบบใน Logto (ในฐานะผู้ให้บริการข้อมูลระบุตัวตน OIDC) เกี่ยวข้องกับทั้ง:
- เซสชัน Logto ส่วนกลาง (คุกกี้เบราว์เซอร์ภายใต้โดเมน Logto)
- สถานะการยืนยันตัวตนฝั่งไคลเอนต์แบบกระจาย (โทเค็นและเซสชันแอปในแต่ละแอป)
เพื่อให้เข้าใจพฤติกรรมการออกจากระบบ ควรแยกสองชั้นนี้ออกจากกัน แล้วดูว่า grant เชื่อมโยงกันอย่างไร
แนวคิดหลัก
เซสชัน Logto คืออะไร?
เซสชัน Logto คือสถานะการลงชื่อเข้าใช้ส่วนกลางที่จัดการโดย Logto สร้างขึ้นหลังจากการยืนยันตัวตนสำเร็จ และแสดงด้วยคุกกี้ภายใต้โดเมน Logto
หากคุกกี้เซสชันยังใช้ได้ ผู้ใช้สามารถยืนยันตัวตนแบบเงียบ (SSO) ข้ามหลายแอปที่เชื่อถือ Logto tenant เดียวกันได้
หากไม่มีเซสชันที่ถูกต้อง Logto จะแสดงหน้าลงชื่อเข้าใช้
Grant คืออะไร?
Grant แทนสถานะการอนุญาตสำหรับผู้ใช้ + แอปไคลเอนต์แต่ละคู่
- เซสชัน Logto หนึ่งอันสามารถมี grant สำหรับหลายแอปไคลเอนต์
- Grant คือสิ่งที่โทเค็นที่ออกให้ผูกอยู่ด้วย
- ในชุดเอกสารนี้ ใช้ grant เป็นหน่วยการอนุญาตข้ามแอป
ความสัมพันธ์ระหว่างเซสชัน, grant, และสถานะการยืนยันตัวตนของไคลเอนต์
- เซสชัน Logto ควบคุมประสบการณ์ SSO ส่วนกลาง
- เซสชัน / โทเค็นภายในแอป ควบคุมว่าผู้ใช้ยังถือว่า “ลงชื่อเข้าใช้” ในแต่ละแอปหรือไม่
- Grant เชื่อมสองโลกนี้ด้วยการแทนสถานะการอนุญาตเฉพาะแอป
ทบทวนการลงชื่อเข้าใช้ (เหตุใดการออกจากระบบจึงมีหลายชั้น)
โทโพโลยีเซสชันข้ามแอป / อุปกรณ์
คุกกี้เซสชันร่วม (เบราว์เซอร์ / user agent เดียวกัน)
หากผู้ใช้ลงชื่อเข้าใช้หลายแอปจากเบราว์เซอร์เดียวกัน แอปเหล่านั้นสามารถใช้คุกกี้เซสชัน Logto เดียวกันและใช้ SSO ได้
คุกกี้เซสชันแยก (อุปกรณ์ / เบราว์เซอร์ต่างกัน)
เบราว์เซอร์ / อุปกรณ์ต่างกันจะถือคุกกี้ Logto คนละชุด ทำให้สถานะเซสชันแยกจากกัน
กลไกการออกจากระบบ
1) ออกจากระบบเฉพาะฝั่งไคลเอนต์
แอปไคลเอนต์ล้างเซสชันและโทเค็นภายในแอปของตนเอง (โทเค็น ID / การเข้าถึง / รีเฟรช) ผู้ใช้จะออกจากสถานะในแอปนั้นเท่านั้น
- เซสชัน Logto อาจยังคงอยู่
- แอปอื่นที่อยู่ภายใต้เซสชัน Logto เดียวกันยังคงใช้ SSO ได้
2) End-session ที่ Logto (ออกจากระบบทั่วทั้งระบบใน Logto เวอร์ชันปัจจุบัน)
เพื่อล้างเซสชัน Logto ส่วนกลาง แอปจะเปลี่ยนเส้นทางผู้ใช้ไปยัง endpoint end session เช่น
https://{your-logto-domain}/oidc/session/end
ในพฤติกรรม SDK Logto ปัจจุบัน:
signOut()เปลี่ยนเส้นทางไป/session/end- จากนั้นไปที่
/session/end/confirm - ฟอร์มยืนยันเริ่มต้นจะส่ง
logout=trueอัตโนมัติ
ดังนั้น การออกจากระบบผ่าน SDK ปัจจุบันจะถือเป็น การออกจากระบบทั่วทั้งระบบ
เกิดอะไรขึ้นระหว่างการออกจากระบบทั่วทั้งระบบ
ระหว่างการออกจากระบบทั่วทั้งระบบ:
- เซสชัน Logto ส่วนกลางจะถูกเพิกถอน
- grant ที่เกี่ยวข้องจะถูกจัดการตามสถานะการอนุญาตของแต่ละแอป:
- หาก ไม่ได้ รับ
offline_accessgrant ที่เกี่ยวข้องจะถูกเพิกถอน - หาก ได้รับ
offline_accessgrant จะไม่ถูกเพิกถอนโดย end-session
- หาก ไม่ได้ รับ
- ในกรณี
offline_accessโทเค็นรีเฟรชและ grant จะยังคงใช้ได้จนกว่า grant จะหมดอายุ
อายุของ grant และผลกระทบของ offline_access
- ค่าเริ่มต้น TTL ของ grant ใน Logto คือ 180 วัน
- หากได้รับ
offline_accessend-session จะไม่เพิกถอน grant ของแอปนั้นโดยปริยาย - สายโทเค็นรีเฟรชที่ผูกกับ grant นั้นจะใช้ได้จนกว่า grant จะหมดอายุ (หรือถูกเพิกถอนโดยตรง)
การออกจากระบบแบบ federated: back-channel logout
เพื่อความสอดคล้องข้ามแอป Logto รองรับ back-channel logout
เมื่อผู้ใช้ออกจากระบบจากแอปหนึ่ง Logto สามารถแจ้งทุกแอปที่อยู่ในเซสชันเดียวกันโดยส่ง logout token ไปยัง back-channel logout URI ที่ลงทะเบียนไว้ของแต่ละแอป
หากเปิดใช้งาน Is session required ในการตั้งค่า back-channel ของแอป logout token จะมี sid เพื่อระบุเซสชัน Logto
ลำดับทั่วไป:
- ผู้ใช้เริ่มออกจากระบบจากแอปหนึ่ง
- Logto ประมวลผล end-session และส่ง logout token ไปยัง back-channel logout URI ที่ลงทะเบียนไว้
- แต่ละแอปตรวจสอบ logout token และล้างเซสชัน / โทเค็นภายในแอปของตนเอง
วิธีการออกจากระบบใน Logto SDKs
- SPA และเว็บ:
client.signOut()ล้างโทเค็นใน local storage และเปลี่ยนเส้นทางไปยัง Logto end-session endpoint คุณสามารถระบุ post-logout redirect URI ได้ - Native (รวม React Native / Flutter): โดยปกติจะล้างโทเค็นใน local storage เท่านั้น webview แบบไม่มีเซสชันหมายถึงไม่มีคุกกี้ Logto ในเบราว์เซอร์ให้ล้าง
สำหรับแอป native ที่ไม่รองรับ webview แบบไม่มีเซสชัน หรือไม่รู้จักการตั้งค่า emphasized (แอป Android ที่ใช้ React Native หรือ Flutter SDK) คุณสามารถบังคับให้ผู้ใช้ต้องลงชื่อเข้าใช้อีกครั้งโดยส่งพารามิเตอร์ prompt=login ในคำขอการยืนยันตัวตน
บังคับให้ยืนยันตัวตนใหม่ทุกครั้งที่เข้าใช้งาน
สำหรับการดำเนินการที่ต้องการความปลอดภัยสูง ให้ใส่ prompt=login ในคำขอการยืนยันตัวตนเพื่อข้าม SSO และบังคับให้กรอกข้อมูลรับรองทุกครั้ง
หากขอ offline_access (เพื่อรับโทเค็นรีเฟรช) ให้ใส่ consent ด้วย เช่น prompt=login consent
การตั้งค่ารวมที่พบบ่อย:
prompt=login consent
คำถามที่พบบ่อย
ฉันไม่ได้รับการแจ้งเตือน back-channel logout
- ตรวจสอบว่าได้ลงทะเบียน back-channel logout URI ใน Logto dashboard อย่างถูกต้อง
- ตรวจสอบว่าแอปของคุณมีสถานะลงชื่อเข้าใช้ที่ใช้งานอยู่สำหรับผู้ใช้ / เซสชันเดียวกัน
แหล่งข้อมูลที่เกี่ยวข้อง
ทำความเข้าใจ OIDC back-channel logout