圖解SSO單點登錄!
1、SSO 說明
SSO 英文全稱 Single Sign On,單點登錄。SSO 是在多個應用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統(tǒng)。https://baike.baidu.com/item/SSO/3451380
例如訪問在網(wǎng)易賬號中心(http://reg.163.com/ )登錄之后 訪問以下站點都是登錄狀態(tài)
網(wǎng)易直播 http://v.163.com 網(wǎng)易博客http://blog.163.com 網(wǎng)易花田 http://love.163.com 網(wǎng)易考拉h(huán)ttps://www.kaola.com 網(wǎng)易 Lofter http://www.lofter.com
2、設計目標
本篇文章也主要是為了探討如何設計 & 實現(xiàn)一個 SSO 系統(tǒng)
以下為需要實現(xiàn)的核心功能:
單點登錄 單點登出 支持跨域單點登錄 支持跨域單點登出
二、SSO 設計與實現(xiàn)
1、核心應用與依賴
| 應用 / 模塊 / 對象 | 說明 |
|---|---|
| 前臺站點 | 需要登錄的站點 |
| SSO 站點 - 登錄 | 提供登錄的頁面 |
| SSO 站點 - 登出 | 提供注銷登錄的入口 |
| SSO 服務 - 登錄 | 提供登錄服務 |
| SSO 服務 - 登錄狀態(tài) | 提供登錄狀態(tài)校驗 / 登錄信息查詢的服務 |
| SSO 服務 - 登出 | 提供用戶注銷登錄的服務 |
| 數(shù)據(jù)庫 | 存儲用戶賬戶信息 |
| 緩存 | 存儲用戶的登錄信息,通常使用 Redis |
2、用戶登錄狀態(tài)的存儲與校驗
常見的 Web 框架對于 Session 的實現(xiàn)都是生成一個 SessionId 存儲在瀏覽器 Cookie 中。然后將 Session 內(nèi)容存儲在服務器端內(nèi)存中,這個 ken.io 在之前 Session 工作原理中也提到過。整體也是借鑒這個思路。用戶登錄成功之后,生成 AuthToken 交給客戶端保存。如果是瀏覽器,就保存在 Cookie 中。如果是手機 App 就保存在 App 本地緩存中。本篇主要探討基于 Web 站點的 SSO。用戶在瀏覽需要登錄的頁面時,客戶端將 AuthToken 提交給 SSO 服務校驗登錄狀態(tài) / 獲取用戶登錄信息
對于登錄信息的存儲,建議采用 Redis,使用 Redis 集群來存儲登錄信息,既可以保證高可用,又可以線性擴充。同時也可以讓 SSO 服務滿足負載均衡 / 可伸縮的需求。
| 對象 | 說明 |
|---|---|
| AuthToken | 直接使用 UUID/GUID 即可,如果有驗證 AuthToken 合法性需求,可以將 UserName + 時間戳加密生成,服務端解密之后驗證合法性 |
| 登錄信息 | 通常是將 UserId,UserName 緩存起來 |
3、用戶登錄 / 登錄校驗
登錄時序圖
按照上圖,用戶登錄后 Authtoken 保存在 Cookie 中。domian= test. com 瀏覽器會將 domain 設置成 .test.com, 這樣訪問所有 *.test.com 的 web 站點,都會將 Authtoken 攜帶到服務器端。然后通過 SSO 服務,完成對用戶狀態(tài)的校驗 / 用戶登錄信息的獲取
登錄信息獲取 / 登錄狀態(tài)校驗
4、用戶登出
用戶登出時要做的事情很簡單:
服務端清除緩存(Redis)中的登錄狀態(tài) 客戶端清除存儲的 AuthToken
登出時序圖
5、跨域登錄、登出
前面提到過,核心思路是客戶端存儲 AuthToken,服務器端通過 Redis 存儲登錄信息。由于客戶端是將 AuthToken 存儲在 Cookie 中的。所以跨域要解決的問題,就是如何解決 Cookie 的跨域讀寫問題。
解決跨域的核心思路就是:
登錄完成之后通過回調(diào)的方式,將 AuthToken 傳遞給主域名之外的站點,該站點自行將 AuthToken 保存在當前域下的 Cookie 中。
登出完成之后通過回調(diào)的方式,調(diào)用非主域名站點的登出頁面,完成設置 Cookie 中的 AuthToken 過期的操作。
跨域登錄(主域名已登錄)
跨域登錄(主域名未登錄)
跨域登出
備注
關(guān)于方案
這次設計方案更多是提供實現(xiàn)思路。如果涉及到 APP 用戶登錄等情況,在訪問 SSO 服務時,增加對 APP 的簽名驗證就好了。當然,如果有無線網(wǎng)關(guān),驗證簽名不是問題。
關(guān)于時序圖
時序圖中并沒有包含所有場景,ken.io 只列舉了核心 / 主要場景,另外對于一些不影響理解思路的消息能省就省了。
作者:ken.io?
來源鏈接:
https://ken.io/note/sso-design-implement
更多精彩?
在公眾號【程序員編程】對話框輸入以下關(guān)鍵詞 查看更多優(yōu)質(zhì)內(nèi)容! 大數(shù)據(jù)?|?Java?|?1024?|?電子書?|?速查表? Python進階?|?面試?|?手冊?|?成神?|?思想?|?小程序 命令行?|?人工智能?|?軟件測試?|?Web前端?|?Python 獲取更多學習資料
視頻 |?面試 |?技術(shù) | 電子書?







