登出 (Sign-out)
在 Logto(作為 OIDC 身分提供者)中,登出涉及:
- 集中式 Logto 工作階段(Logto 網域下的瀏覽器 cookie),以及
- 分散式用戶端驗證狀態(每個應用程式中的權杖和本地應用程式工作階段)。
為了理解登出行為,建議將這兩層分開,並了解 授權單元 (grants) 如何連結它們。
核心概念
什麼是 Logto 工作階段?
Logto 工作階段是由 Logto 管理的集中式登入狀態。它在驗證成功後建立,並以 Logto 網域下的 cookie 表示。
如果工作階段 cookie 有效,使用者可以在多個信任同一 Logto 租戶的應用程式間靜默驗證(單一登入,SSO)。
若不存在有效的工作階段,Logto 會顯示登入頁面。
什麼是授權單元 (grants)?
授權單元 (grant) 代表特定使用者 + 用戶端應用程式組合的授權狀態。
- 一個 Logto 工作階段可以擁有多個用戶端應用程式的授權單元。
- 授權單元是已發行權杖所關聯的對象。
- 在本文件集中,授權單元 (grant) 作為跨應用程式的授權單位。
工作階段、授權單元與用戶端驗證狀態的關係
- Logto 工作階段 控制集中式單一登入 (SSO) 體驗。
- 用戶端本地工作階段 / 權杖 控制每個應用程式是否將使用者視為已登入。
- 授權單元 (grants) 透過代表應用程式專屬授權狀態,連結這兩個世界。
登入回顧(為什麼登出是多層次的)
跨應用程式 / 裝置的工作階段拓撲
共用工作階段 cookie(同一瀏覽器 / 使用者代理)
若使用者從同一瀏覽器登入多個應用程式,這些應用程式可重用同一 Logto 工作階段 cookie,並享有單一登入 (SSO) 行為。
隔離的工作階段 cookie(不同裝置 / 瀏覽器)
不同瀏覽器 / 裝置持有不同的 Logto cookie,因此登入工作階段彼此隔離。
登出機制
1) 僅用戶端登出
用戶端應用程式清除自身本地工作階段與權杖(ID / 存取 / 重新整理權杖)。這僅將使用者從該應用程式的本地狀態登出。
- Logto 工作階段可能仍然有效。
- 其他同一 Logto 工作階段下的應用程式仍可單一登入 (SSO)。
2) Logto 端結束工作階段(目前 Logto 實作下的全域登出)
若要清除集中式 Logto 工作階段,應用程式會將使用者重新導向至結束工作階段端點,例如:
https://{your-logto-domain}/oidc/session/end
目前 Logto SDK 行為如下:
signOut()會重新導向至/session/end。- 接著進入
/session/end/confirm。 - 預設確認表單會自動提交
logout=true。
因此,目前 SDK 的登出被視為 全域登出。
全域登出時會發生什麼事
全域登出期間:
- 集中式 Logto 工作階段會被撤銷。
- 相關應用程式授權單元依應用程式授權狀態處理:
- 若 未授予
offline_access,相關授權單元會被撤銷。 - 若 已授予
offline_access,結束工作階段不會撤銷該授權單元。
- 若 未授予
- 對於
offline_access情境,重新整理權杖與授權單元會持續有效,直到授權單元到期。
授權單元存續時間與 offline_access 影響
- Logto 預設授權單元 TTL 為 180 天。
- 若授予
offline_access,結束工作階段預設不會撤銷該應用程式授權單元。 - 與該授權單元關聯的重新整理權杖可持續使用,直到授權單元到期(或被明確撤銷)。
聯合登出:後端通道登出 (back-channel logout)
為了跨應用程式一致性,Logto 支援 後端通道登出 (back-channel logout)。
當使用者從某個應用程式登出時,Logto 會向所有參與同一工作階段的應用程式發送登出權杖至其註冊的後端通道登出 URI。
若應用程式後端通道設定中啟用 Is session required,登出權杖會包含 sid 以識別 Logto 工作階段。
典型流程:
- 使用者從某個應用程式啟動登出。
- Logto 處理結束工作階段,並向註冊的後端通道登出 URI 發送登出權杖。
- 各應用程式驗證登出權杖並清除自身本地工作階段 / 權杖。
Logto SDK 的登出方法
- SPA 與網頁:
client.signOut()會清除本地權杖儲存並重新導向至 Logto 結束工作階段端點。你可以提供登出後重新導向 URI。 - 原生(包含 React Native / Flutter):通常僅清除本地權杖儲存。無持久 Logto 瀏覽器 cookie 可清除(sessionless webview)。
對於不支援 sessionless webview 或未識別 emphasized 設定的原生應用程式(如 React Native 或 Flutter SDK 的 Android 應用程式),你可以在驗證請求中傳遞 prompt=login 參數,強制使用者再次登入。
強制每次存取都重新驗證
對於高安全性操作,在驗證請求中加入 prompt=login,可繞過 SSO 並每次強制輸入憑證。
若請求 offline_access(以取得重新整理權杖),也請加入 consent,即 prompt=login consent。
典型組合設定:
prompt=login consent
常見問題
我沒有收到後端通道登出通知。
- 請確認後端通道登出 URI 已正確註冊於 Logto 控制台。
- 請確認你的應用程式對同一使用者 / 工作階段上下文有有效登入狀態。
相關資源
理解 OIDC 後端通道登出 (Understanding OIDC back-channel logout)。