單點登入 SSO ( Single Sign-On ) 的效果是“一處登入,多處登入”,用於內部多個系統共用一套登入系統。
舉個例子,你在淘寶登入,然後進入天貓,會發現也處於登入狀態。
SSO 是一種效果,即“一處登入,多處登入”,但它並不包含具體實現,業界的實現方案有 CAS、OAuth、OICD 等。
從前端視角來看,SSO 通常有一個認證中心,專門管理使用者認證和授權,所謂單點,指的就是認證中心。
具體如何管理?模式有兩種,Session 模式和Token 模式。
Session 模式
Session ( 會話 ) 模式就是認證中心用一張表格管理所有登入的使用者,Session ID 就是表格中表示已登入使用者的唯一 ID。
簡單介紹一下上圖的主要過程:
客戶端提交賬號密碼到認證中心;
認證中心驗證賬號密碼後,在 Session 表中新增一項,表示已登入;
客戶端憑 Session ID 請求資源;
伺服器請求驗證 Session,認證中心查表判斷 Session 是否有效;
驗證透過後,返回資源。
使用者持續一段時間 ( 比如 20 分鐘 ) 不訪問,只需將 Session ID 從表中刪除,即可結束會話。
Session 模式將所有使用者集中在一張表中,好處是方便管理,但這種模式也有幾個問題:
Session 表會非常大
認證中心不能出錯,否則所有子系統都無法使用
認證中心請求壓力大,所有子系統都要向它驗證 Session
為減輕認證中心的負擔,人們提出了 Token 模式。
Token 模式
token 模式的關鍵在於,認證中心頒發登入憑證,各子系統自行驗證憑證。
從上圖可以看出,使用者提交賬號密碼後,認證中心只返回一個 token,它通常是 JWT 格式,客戶端憑 token 訪問伺服器資源。
建立和驗證 token 都需要一個金鑰,認證中心只需將金鑰分發到各子系統,子系統即可自行認證 token 是否有效。
這種模式減輕了認證中心的壓力,但也大大降低了對使用者的管理能力。比如認證中心想阻止某使用者登入,它需要向所有子系統廣播這條訊息,否則只能等使用者手上的 token 過期。
雙 token 可以解決這個問題。
雙 token 模式
使用者登入後,認證中心返回兩個 token。
短期 token 過期時間短,比如 20 分鐘過期,用來訪問伺服器資源;
重新整理 token 過期時間長,用來申請新的短期 token;
短期 token 過期,則用重新整理 token 申請新的;若重新整理 token 也過期,則需重新登入。
這種做法的關鍵在於,讓客戶端每過一小段時間,就來認證中心續期,認證中心可以決定是否頒發新的 token,從而提高認證中心的管理能力。