單點(diǎn)登陸(SSO)

一虐杯、前言

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)

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)用與依賴
單點(diǎn)登錄(SSO)設(shè)計(jì)
應(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)
  • 登錄時序圖
SSO系統(tǒng)設(shè)計(jì)-登錄時序圖

按照上圖寺惫,用戶登錄后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)
SSO系統(tǒng)設(shè)計(jì)-登錄信息獲取/登錄狀態(tài)校驗(yàn)
4.用戶登出

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

  1. 服務(wù)端清除緩存(Redis)中的登錄狀態(tài)
  2. 客戶端清除存儲的AuthToken
  • 登出時序圖
SSO系統(tǒng)設(shè)計(jì)-用戶登出
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過期的操作憾筏。
  • 跨域登錄(主域名已登錄)
SSO系統(tǒng)設(shè)計(jì)-跨域登錄(主域名已登錄)
  • 跨域登錄(主域名未登錄)
SSO系統(tǒng)設(shè)計(jì)-跨域登錄(主域名未登錄)
  • 跨域登出
SSO系統(tǒng)設(shè)計(jì)-跨域登出

三.備注

  • 關(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子是嗜,更是在濱河造成了極大的恐慌愈案,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,888評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹅搪,死亡現(xiàn)場離奇詭異站绪,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)丽柿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,677評論 3 399
  • 文/潘曉璐 我一進(jìn)店門恢准,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人甫题,你說我怎么就攤上這事馁筐。” “怎么了幔睬?”我有些...
    開封第一講書人閱讀 168,386評論 0 360
  • 文/不壞的土叔 我叫張陵眯漩,是天一觀的道長。 經(jīng)常有香客問我麻顶,道長赦抖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,726評論 1 297
  • 正文 為了忘掉前任辅肾,我火速辦了婚禮队萤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矫钓。我一直安慰自己要尔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,729評論 6 397
  • 文/花漫 我一把揭開白布新娜。 她就那樣靜靜地躺著赵辕,像睡著了一般。 火紅的嫁衣襯著肌膚如雪概龄。 梳的紋絲不亂的頭發(fā)上还惠,一...
    開封第一講書人閱讀 52,337評論 1 310
  • 那天,我揣著相機(jī)與錄音私杜,去河邊找鬼蚕键。 笑死,一個胖子當(dāng)著我的面吹牛衰粹,可吹牛的內(nèi)容都是我干的锣光。 我是一名探鬼主播,決...
    沈念sama閱讀 40,902評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼铝耻,長吁一口氣:“原來是場噩夢啊……” “哼誊爹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,807評論 0 276
  • 序言:老撾萬榮一對情侶失蹤替废,失蹤者是張志新(化名)和其女友劉穎箍铭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椎镣,經(jīng)...
    沈念sama閱讀 46,349評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,439評論 3 340
  • 正文 我和宋清朗相戀三年兽赁,在試婚紗的時候發(fā)現(xiàn)自己被綠了状答。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,567評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡刀崖,死狀恐怖惊科,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情亮钦,我是刑警寧澤馆截,帶...
    沈念sama閱讀 36,242評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站蜂莉,受9級特大地震影響蜡娶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜映穗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,933評論 3 334
  • 文/蒙蒙 一窖张、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚁滋,春花似錦宿接、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,420評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至走诞,卻和暖如春副女,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背速梗。 一陣腳步聲響...
    開封第一講書人閱讀 33,531評論 1 272
  • 我被黑心中介騙來泰國打工肮塞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姻锁。 一個月前我還...
    沈念sama閱讀 48,995評論 3 377
  • 正文 我出身青樓枕赵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親位隶。 傳聞我的和親對象是個殘疾皇子拷窜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,585評論 2 359