一虐杯、前言
1.SSO說明
SSO英文全稱Single Sign On帅戒,單點(diǎn)登錄灯帮。SSO是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)逻住。https://baike.baidu.com/item/SSO/3451380
例如訪問在網(wǎng)易賬號中心(http://reg.163.com/ )登錄之后
訪問以下站點(diǎn)都是登錄狀態(tài)
- 網(wǎng)易直播 http://v.163.com
- 網(wǎng)易博客 http://blog.163.com
- 網(wǎng)易花田 http://love.163.com
- 網(wǎng)易考拉 https://www.kaola.com
- 網(wǎng)易Lofter http://www.lofter.com
2.設(shè)計(jì)目標(biāo)
本篇文章也主要是為了探討如何設(shè)計(jì)&實(shí)現(xiàn)一個SSO系統(tǒng)
以下為需要實(shí)現(xiàn)的核心功能:
- 單點(diǎn)登錄
- 單點(diǎn)登出
- 支持跨域單點(diǎn)登錄
- 支持跨域單點(diǎn)登出
二钟哥、SSO設(shè)計(jì)與實(shí)現(xiàn)
1.核心應(yīng)用與依賴
應(yīng)用/模塊/對象 | 說明 |
---|---|
前臺站點(diǎn) | 需要登錄的站點(diǎn) |
SSO站點(diǎn)-登錄 | 提供登錄的頁面 |
SSO站點(diǎn)-登出 | 提供注銷登錄的入口 |
SSO服務(wù)-登錄 | 提供登錄服務(wù) |
SSO服務(wù)-登錄狀態(tài) | 提供登錄狀態(tài)校驗(yàn)/登錄信息查詢的服務(wù) |
SSO服務(wù)-登出 | 提供用戶注銷登錄的服務(wù) |
數(shù)據(jù)庫 | 存儲用戶賬戶信息 |
緩存 | 存儲用戶的登錄信息,通常使用Redis |
2.用戶登錄狀態(tài)的存儲與校驗(yàn)
常見的Web框架對于Session的實(shí)現(xiàn)都是生成一個SessionId存儲在瀏覽器Cookie中瞎访。然后將Session內(nèi)容存儲在服務(wù)器端內(nèi)存中腻贰,這個 ken.io 在之前Session工作原理中也提到過。整體也是借鑒這個思路扒秸。
用戶登錄成功之后播演,生成AuthToken交給客戶端保存。如果是瀏覽器伴奥,就保存在Cookie中宾巍。如果是手機(jī)App就保存在App本地緩存中。本篇主要探討基于Web站點(diǎn)的SSO渔伯。
用戶在瀏覽需要登錄的頁面時,客戶端將AuthToken提交給SSO服務(wù)校驗(yàn)登錄狀態(tài)/獲取用戶登錄信息
對于登錄信息的存儲肄程,建議采用Redis锣吼,使用Redis集群來存儲登錄信息选浑,既可以保證高可用,又可以線性擴(kuò)充玄叠。同時也可以讓SSO服務(wù)滿足負(fù)載均衡/可伸縮的需求古徒。
對象 | 說明 |
---|---|
AuthToken | 直接使用UUID/GUID即可,如果有驗(yàn)證AuthToken合法性需求读恃,可以將UserName+時間戳加密生成隧膘,服務(wù)端解密之后驗(yàn)證合法性 |
登錄信息 | 通常是將UserId,UserName緩存起來 |
3.用戶登錄/登錄校驗(yàn)
- 登錄時序圖
按照上圖寺惫,用戶登錄后Authtoken保存在Cookie中疹吃。 domian= test. com
瀏覽器會將domain設(shè)置成 .test.com,
這樣訪問所有*.test.com的web站點(diǎn)西雀,都會將Authtoken攜帶到服務(wù)器端萨驶。
然后通過SSO服務(wù),完成對用戶狀態(tài)的校驗(yàn)/用戶登錄信息的獲取
- 登錄信息獲取/登錄狀態(tài)校驗(yàn)
4.用戶登出
用戶登出時要做的事情很簡單:
- 服務(wù)端清除緩存(Redis)中的登錄狀態(tài)
- 客戶端清除存儲的AuthToken
- 登出時序圖
5.跨域登錄艇肴、登出
前面提到過腔呜,核心思路是客戶端存儲AuthToken,服務(wù)器端通過Redis存儲登錄信息再悼。由于客戶端是將AuthToken存儲在Cookie中的核畴。所以跨域要解決的問題,就是如何解決Cookie的跨域讀寫問題冲九。
解決跨域的核心思路就是:
- 登錄完成之后通過回調(diào)的方式谤草,將AuthToken傳遞給主域名之外的站點(diǎn),該站點(diǎn)自行將AuthToken保存在當(dāng)前域下的Cookie中娘侍。
- 登出完成之后通過回調(diào)的方式咖刃,調(diào)用非主域名站點(diǎn)的登出頁面,完成設(shè)置Cookie中的AuthToken過期的操作憾筏。
- 跨域登錄(主域名已登錄)
- 跨域登錄(主域名未登錄)
- 跨域登出
三.備注
- 關(guān)于方案
這次設(shè)計(jì)方案更多是提供實(shí)現(xiàn)思路嚎杨。如果涉及到APP用戶登錄等情況,在訪問SSO服務(wù)時氧腰,增加對APP的簽名驗(yàn)證就好了枫浙。當(dāng)然,如果有無線網(wǎng)關(guān)古拴,驗(yàn)證簽名不是問題箩帚。
- 關(guān)于時序圖
時序圖中并沒有包含所有場景,ken.io只列舉了核心/主要場景黄痪,另外對于一些不影響理解思路的消息能省就省了紧帕。
轉(zhuǎn)載自: https://ken.io/note/sso-design-implement