單點登錄(SSO)的設(shè)計&實現(xiàn)思路

一、前言

1、SSO說明

SSO英文全稱Single Sign On,單點登錄。SSO是在多個應(yīng)用系統(tǒng)中,用戶只需要登錄一次就可以訪問所有相互信任的應(yīng)用系統(tǒng)。https://baike.baidu.com/item/SSO/3451380

例如訪問在網(wǎng)易賬號中心(http://reg.163.com/ )登錄之后
訪問以下站點都是登錄狀態(tài)

2、設(shè)計目標(biāo)

本篇文章也主要是為了探討如何設(shè)計&實現(xiàn)一個SSO系統(tǒng)

以下為需要實現(xiàn)的核心功能:

  • 單點登錄
  • 單點登出
  • 支持跨域單點登錄
  • 支持跨域單點登出

二、SSO設(shè)計與實現(xiàn)

1、核心應(yīng)用與依賴

單點登錄(SSO)設(shè)計
應(yīng)用/模塊/對象 說明
前臺站點 需要登錄的站點
SSO站點-登錄 提供登錄的頁面
SSO站點-登出 提供注銷登錄的入口
SSO服務(wù)-登錄 提供登錄服務(wù)
SSO服務(wù)-登錄狀態(tài) 提供登錄狀態(tài)校驗/登錄信息查詢的服務(wù)
SSO服務(wù)-登出 提供用戶注銷登錄的服務(wù)
數(shù)據(jù)庫 存儲用戶賬戶信息
緩存 存儲用戶的登錄信息,通常使用Redis

2、用戶登錄狀態(tài)的存儲與校驗

常見的Web框架對于Session的實現(xiàn)都是生成一個SessionId存儲在瀏覽器Cookie中。然后將Session內(nèi)容存儲在服務(wù)器端內(nèi)存中,這個 ken.io 在之前Session工作原理中也提到過。整體也是借鑒這個思路。
用戶登錄成功之后,生成AuthToken交給客戶端保存。如果是瀏覽器,就保存在Cookie中。如果是手機App就保存在App本地緩存中。本篇主要探討基于Web站點的SSO。
用戶在瀏覽需要登錄的頁面時,客戶端將AuthToken提交給SSO服務(wù)校驗登錄狀態(tài)/獲取用戶登錄信息

對于登錄信息的存儲,建議采用Redis,使用Redis集群來存儲登錄信息,既可以保證高可用,又可以線性擴充。同時也可以讓SSO服務(wù)滿足負載均衡/可伸縮的需求。

對象 說明
AuthToken 直接使用UUID/GUID即可,如果有驗證AuthToken合法性需求,可以將UserName+時間戳加密生成,服務(wù)端解密之后驗證合法性
登錄信息 通常是將UserId,UserName緩存起來

3、用戶登錄/登錄校驗

  • 登錄時序圖
SSO系統(tǒng)設(shè)計-登錄時序圖

按照上圖,用戶登錄后Authtoken保存在Cookie中。 domian= test. com
瀏覽器會將domain設(shè)置成 .test.com,
這樣訪問所有*.test.com的web站點,都會將Authtoken攜帶到服務(wù)器端。
然后通過SSO服務(wù),完成對用戶狀態(tài)的校驗/用戶登錄信息的獲取

  • 登錄信息獲取/登錄狀態(tài)校驗
SSO系統(tǒng)設(shè)計-登錄信息獲取/登錄狀態(tài)校驗

4、用戶登出

用戶登出時要做的事情很簡單:

  1. 服務(wù)端清除緩存(Redis)中的登錄狀態(tài)
  2. 客戶端清除存儲的AuthToken
  • 登出時序圖
SSO系統(tǒng)設(shè)計-用戶登出

5、跨域登錄、登出

前面提到過,核心思路是客戶端存儲AuthToken,服務(wù)器端通過Redis存儲登錄信息。由于客戶端是將AuthToken存儲在Cookie中的。所以跨域要解決的問題,就是如何解決Cookie的跨域讀寫問題。

解決跨域的核心思路就是:

  • 登錄完成之后通過回調(diào)的方式,將AuthToken傳遞給主域名之外的站點,該站點自行將AuthToken保存在當(dāng)前域下的Cookie中。

  • 登出完成之后通過回調(diào)的方式,調(diào)用非主域名站點的登出頁面,完成設(shè)置Cookie中的AuthToken過期的操作。

  • 跨域登錄(主域名已登錄)

SSO系統(tǒng)設(shè)計-跨域登錄(主域名已登錄)
  • 跨域登錄(主域名未登錄)
SSO系統(tǒng)設(shè)計-跨域登錄(主域名未登錄)
  • 跨域登出
SSO系統(tǒng)設(shè)計-跨域登出

三、備注

  • 關(guān)于方案

這次設(shè)計方案更多是提供實現(xiàn)思路。如果涉及到APP用戶登錄等情況,在訪問SSO服務(wù)時,增加對APP的簽名驗證就好了。當(dāng)然,如果有無線網(wǎng)關(guān),驗證簽名不是問題。

  • 關(guān)于時序圖

時序圖中并沒有包含所有場景,ken.io只列舉了核心/主要場景,另外對于一些不影響理解思路的消息能省就省了。

  • 前置知識

1、Session的工作原理和使用經(jīng)驗:https://ken.io/note/session-principle-skill
2、Cookie的特點和使用經(jīng)驗/建議總結(jié):https://ken.io/note/cookie-feature-skill

以上,如有疑問,歡迎聯(lián)系我:https://ken.io/home/about


本文首發(fā)于我的獨立博客:https://ken.io/note/sso-design-implement

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容