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

背景

在企業(yè)發(fā)展初期,企業(yè)使用的系統(tǒng)很少荤崇,通常一個(gè)或者兩個(gè)拌屏,每個(gè)系統(tǒng)都有自己的登錄模塊,運(yùn)營(yíng)人員每天用自己的賬號(hào)登錄术荤,很方便倚喂。
但隨著企業(yè)的發(fā)展,用到的系統(tǒng)隨之增多瓣戚,運(yùn)營(yíng)人員在操作不同的系統(tǒng)時(shí)端圈,需要多次登錄,而且每個(gè)系統(tǒng)的賬號(hào)都不一樣子库,這對(duì)于運(yùn)營(yíng)人員
來(lái)說(shuō)舱权,很不方便。于是仑嗅,就想到是不是可以在一個(gè)系統(tǒng)登錄宴倍,其他系統(tǒng)就不用登錄了呢张症?這就是單點(diǎn)登錄要解決的問(wèn)題。

單點(diǎn)登錄英文全稱Single Sign On鸵贬,簡(jiǎn)稱就是SSO俗他。它的解釋是:在多個(gè)應(yīng)用系統(tǒng)中,只需要登錄一次阔逼,就可以訪問(wèn)其他相互信任的應(yīng)用系統(tǒng)兆衅。

如圖所示,圖中有4個(gè)系統(tǒng)嗜浮,分別是Application1羡亩、Application2、Application3周伦、和SSO夕春。Application1未荒、Application2专挪、Application3沒(méi)有登錄模塊,而SSO只有登錄模塊片排,沒(méi)有其他的業(yè)務(wù)模塊寨腔,當(dāng)Application1、Application2率寡、Application3需要登錄時(shí)迫卢,將跳到SSO系統(tǒng),SSO系統(tǒng)完成登錄冶共,其他的應(yīng)用系統(tǒng)也就隨之登錄了乾蛤。這完全符合我們對(duì)單點(diǎn)登錄(SSO)的定義。

技術(shù)實(shí)現(xiàn)

在說(shuō)單點(diǎn)登錄(SSO)的技術(shù)實(shí)現(xiàn)之前捅僵,我們先說(shuō)一說(shuō)普通的登錄認(rèn)證機(jī)制家卖。


如上圖所示,我們?cè)跒g覽器(Browser)中訪問(wèn)一個(gè)應(yīng)用庙楚,這個(gè)應(yīng)用需要登錄上荡,我們填寫完用戶名和密碼后,完成登錄認(rèn)證馒闷。這時(shí)酪捡,我們?cè)谶@個(gè)用戶的session中標(biāo)記登錄狀態(tài)為yes(已登錄),同時(shí)在瀏覽器(Browser)中寫入Cookie纳账,這個(gè)Cookie是這個(gè)用戶的唯一標(biāo)識(shí)逛薇。下次我們?cè)僭L問(wèn)這個(gè)應(yīng)用的時(shí)候,請(qǐng)求中會(huì)帶上這個(gè)Cookie疏虫,服務(wù)端會(huì)根據(jù)這個(gè)Cookie找到對(duì)應(yīng)的session永罚,通過(guò)session來(lái)判斷這個(gè)用戶是否登錄帅涂。如果不做特殊配置,這個(gè)Cookie的名字叫做jsessionid尤蛮,值在服務(wù)端(server)是唯一的媳友。

同域下的單點(diǎn)登錄

一個(gè)企業(yè)一般情況下只有一個(gè)域名,通過(guò)二級(jí)域名區(qū)分不同的系統(tǒng)产捞。比如我們有個(gè)域名叫做:a.com醇锚,同時(shí)有兩個(gè)業(yè)務(wù)系統(tǒng)分別為:app1.a.com和app2.a.com。我們要做單點(diǎn)登錄(SSO)坯临,需要一個(gè)登錄系統(tǒng)焊唬,叫做:sso.a.com。

我們只要在sso.a.com登錄看靠,app1.a.com和app2.a.com就也登錄了赶促。通過(guò)上面的登陸認(rèn)證機(jī)制,我們可以知道挟炬,在sso.a.com中登錄了睬魂,其實(shí)是在sso.a.com的服務(wù)端的session中記錄了登錄狀態(tài),同時(shí)在瀏覽器端(Browser)的sso.a.com下寫入了Cookie招狸。那么我們?cè)趺床拍茏宎pp1.a.com和app2.a.com登錄呢甜孤?這里有兩個(gè)問(wèn)題:

  • Cookie是不能跨域的,我們Cookie的domain屬性是sso.a.com粥喜,在給app1.a.com和app2.a.com發(fā)送請(qǐng)求是帶不上的凸主。
  • sso、app1和app2是不同的應(yīng)用额湘,它們的session存在自己的應(yīng)用內(nèi)卿吐,是不共享的。


那么我們?nèi)绾谓鉀Q這兩個(gè)問(wèn)題呢锋华?針對(duì)第一個(gè)問(wèn)題嗡官,sso登錄以后,可以將Cookie的域設(shè)置為頂域供置,即.a.com谨湘,這樣所有子域的系統(tǒng)都可以訪問(wèn)到頂域的Cookie。我們?cè)谠O(shè)置Cookie時(shí)芥丧,只能設(shè)置頂域和自己的域紧阔,不能設(shè)置其他的域。比如:我們不能在自己的系統(tǒng)中給baidu.com的域設(shè)置Cookie续担。

Cookie的問(wèn)題解決了擅耽,我們?cè)賮?lái)看看session的問(wèn)題。我們?cè)趕so系統(tǒng)登錄了物遇,這時(shí)再訪問(wèn)app1乖仇,Cookie也帶到了app1的服務(wù)端(Server)憾儒,app1的服務(wù)端怎么找到這個(gè)Cookie對(duì)應(yīng)的Session呢?這里就要把3個(gè)系統(tǒng)的Session共享乃沙,如圖所示起趾。共享Session的解決方案有很多,例如:Spring-Session警儒。這樣第2個(gè)問(wèn)題也解決了训裆。

同域下的單點(diǎn)登錄就實(shí)現(xiàn)了,但這還不是真正的單點(diǎn)登錄蜀铲。

不同域下的單點(diǎn)登錄

同域下的單點(diǎn)登錄是巧用了Cookie頂域的特性边琉。如果是不同域呢?不同域之間Cookie是不共享的记劝,怎么辦变姨?

一次「從 A 系統(tǒng)引發(fā)登錄,到 B 系統(tǒng)不用登錄」的完整流程


  • 用戶進(jìn)入 A 系統(tǒng)厌丑,沒(méi)有登錄憑證(ticket)定欧,A 系統(tǒng)給他跳到 SSO
  • SSO 沒(méi)登錄過(guò),也就沒(méi)有 sso 系統(tǒng)下沒(méi)有憑證(注意這個(gè)和前面 A ticket 是兩回事)蹄衷,輸入賬號(hào)密碼登錄
  • SSO 賬號(hào)密碼驗(yàn)證成功忧额,通過(guò)接口返回做兩件事:一是種下 sso 系統(tǒng)下憑證(記錄用戶在 SSO 登錄狀態(tài));二是下發(fā)一個(gè) ticket
  • 客戶端拿到 ticket愧口,保存起來(lái),帶著請(qǐng)求系統(tǒng) A 接口
  • 系統(tǒng) A 校驗(yàn) ticket类茂,成功后正常處理業(yè)務(wù)請(qǐng)求
  • 此時(shí)用戶第一次進(jìn)入系統(tǒng) B耍属,沒(méi)有登錄憑證(ticket),B 系統(tǒng)給他跳到 SSO
  • SSO 登錄過(guò)巩检,系統(tǒng)下有憑證厚骗,不用再次登錄,只需要下發(fā) ticket
  • 客戶端拿到 ticket兢哭,保存起來(lái)领舰,帶著請(qǐng)求系統(tǒng) B 接口

完整版本:考慮瀏覽器的場(chǎng)景
上面的過(guò)程看起來(lái)沒(méi)問(wèn)題,實(shí)際上很多 APP 等端上這樣就夠了迟螺。但在瀏覽器下不見(jiàn)得好用冲秽。
看這里:


對(duì)瀏覽器來(lái)說(shuō),SSO 域下返回的數(shù)據(jù)要怎么存矩父,才能在訪問(wèn) A 的時(shí)候帶上锉桑?瀏覽器對(duì)跨域有嚴(yán)格限制,cookie窍株、localStorage 等方式都是有域限制的民轴。

這就需要也只能由 A 提供 A 域下存儲(chǔ)憑證的能力攻柠。一般我們是這么做的:



圖中我們通過(guò)顏色把瀏覽器當(dāng)前所處的域名標(biāo)記出來(lái)。注意圖中灰底文字說(shuō)明部分的變化后裸。

  • 在 SSO 域下瑰钮,SSO 不是通過(guò)接口把 ticket 直接返回,而是通過(guò)一個(gè)帶 code 的 URL 重定向到系統(tǒng) A 的接口上微驶,這個(gè)接口通常在 A 向 SSO 注冊(cè)時(shí)約定
  • 瀏覽器被重定向到 A 域下飞涂,帶著 code 訪問(wèn)了 A 的 callback 接口,callback 接口通過(guò) code 換取 ticket
  • 這個(gè) code 不同于 ticket祈搜,code 是一次性的较店,暴露在 URL 中,只為了傳一下?lián)Q ticket容燕,換完就失效
  • callback 接口拿到 ticket 后梁呈,在自己的域下 set cookie 成功
  • 在后續(xù)請(qǐng)求中,只需要把 cookie 中的 ticket 解析出來(lái)蘸秘,去 SSO 驗(yàn)證就好
    訪問(wèn) B 系統(tǒng)也是一樣

有的同學(xué)問(wèn)我官卡,SSO系統(tǒng)登錄后,跳回原業(yè)務(wù)系統(tǒng)時(shí)醋虏,帶了個(gè)參數(shù)ST寻咒,業(yè)務(wù)系統(tǒng)還要拿ST再次訪問(wèn)SSO進(jìn)行驗(yàn)證,覺(jué)得這個(gè)步驟有點(diǎn)多余颈嚼。他想SSO登錄認(rèn)證通過(guò)后毛秘,通過(guò)回調(diào)地址將用戶信息返回給原業(yè)務(wù)系統(tǒng),原業(yè)務(wù)系統(tǒng)直接設(shè)置登錄狀態(tài)阻课,這樣流程簡(jiǎn)單叫挟,也完成了登錄,不是很好嗎限煞?

其實(shí)這樣問(wèn)題時(shí)很嚴(yán)重的抹恳,如果我在SSO沒(méi)有登錄,而是直接在瀏覽器中敲入回調(diào)的地址署驻,并帶上偽造的用戶信息奋献,是不是業(yè)務(wù)系統(tǒng)也認(rèn)為登錄了呢?這是很可怕的旺上。

總結(jié)

單點(diǎn)登錄(SSO)的所有流程都介紹完了瓶蚂,原理大家都清楚了「Ч伲總結(jié)一下單點(diǎn)登錄要做的事情:

  • 單點(diǎn)登錄(SSO系統(tǒng))是保障各業(yè)務(wù)系統(tǒng)的用戶資源的安全 扬跋。
  • 各個(gè)業(yè)務(wù)系統(tǒng)獲得的信息是,這個(gè)用戶能不能訪問(wèn)我的資源凌节。
  • 單點(diǎn)登錄钦听,資源都在各個(gè)業(yè)務(wù)系統(tǒng)這邊洒试,不在SSO那一方。 用戶在給SSO服務(wù)器提供了用戶名密碼后朴上,作為業(yè)務(wù)系統(tǒng)并不知道這件事垒棋。 SSO隨便給業(yè)務(wù)系統(tǒng)一個(gè)ST,那么業(yè)務(wù)系統(tǒng)是不能確定這個(gè)ST是用戶偽造的痪宰,還是真的有效叼架,所以要拿著這個(gè)ST去SSO服務(wù)器再問(wèn)一下,這個(gè)用戶給我的ST是否有效衣撬,是有效的我才能讓這個(gè)用戶訪問(wèn)乖订。

參考:https://yq.aliyun.com/articles/636281
https://juejin.cn/post/6898630134530752520?searchId=20231122192251CAA8987647B4353F4EF5

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市具练,隨后出現(xiàn)的幾起案子乍构,更是在濱河造成了極大的恐慌,老刑警劉巖扛点,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件哥遮,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡陵究,警方通過(guò)查閱死者的電腦和手機(jī)眠饮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)铜邮,“玉大人仪召,你說(shuō)我怎么就攤上這事∩啵” “怎么了返咱?”我有些...
    開(kāi)封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)牍鞠。 經(jīng)常有香客問(wèn)我,道長(zhǎng)评姨,這世上最難降的妖魔是什么难述? 我笑而不...
    開(kāi)封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮吐句,結(jié)果婚禮上胁后,老公的妹妹穿的比我還像新娘。我一直安慰自己嗦枢,他們只是感情好攀芯,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著文虏,像睡著了一般侣诺。 火紅的嫁衣襯著肌膚如雪殖演。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天年鸳,我揣著相機(jī)與錄音趴久,去河邊找鬼。 笑死搔确,一個(gè)胖子當(dāng)著我的面吹牛彼棍,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播膳算,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼座硕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了涕蜂?” 一聲冷哼從身側(cè)響起华匾,我...
    開(kāi)封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宇葱,沒(méi)想到半個(gè)月后瘦真,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡黍瞧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年诸尽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片印颤。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡您机,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出年局,到底是詐尸還是另有隱情际看,我是刑警寧澤,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布矢否,位于F島的核電站仲闽,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏僵朗。R本人自食惡果不足惜赖欣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望验庙。 院中可真熱鬧顶吮,春花似錦、人聲如沸粪薛。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至湃交,卻和暖如春熟空,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背巡揍。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工痛阻, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人腮敌。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓阱当,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親糜工。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弊添,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景 在企業(yè)發(fā)展初期,企業(yè)使用的系統(tǒng)很少捌木,通常一個(gè)或者兩個(gè)油坝,每個(gè)系統(tǒng)都有自己的登錄模塊,運(yùn)營(yíng)人員每天用自己的賬號(hào)登...
    zhuchangsheng閱讀 1,860評(píng)論 0 3
  • 單點(diǎn)登錄(SSO)看這一篇就夠了-云棲社區(qū)-阿里云 背景 在企業(yè)發(fā)展初期刨裆,企業(yè)使用的系統(tǒng)很少澈圈,通常一個(gè)或者兩個(gè),每...
    DavieKong閱讀 798評(píng)論 0 4
  • 背景 在企業(yè)發(fā)展初期帆啃,企業(yè)使用的系統(tǒng)很少瞬女,通常一個(gè)或者兩個(gè),每個(gè)系統(tǒng)都有自己的登錄模塊努潘,運(yùn)營(yíng)人員每天用自己的賬號(hào)登...
    牛初九閱讀 324,202評(píng)論 91 714
  • 背景: 在企業(yè)發(fā)展初期的時(shí)候,企業(yè)公司只有一個(gè)server,慢慢的server開(kāi)始增多,但是每個(gè)server都要進(jìn)...
    98年的大哥哥閱讀 117評(píng)論 0 0
  • 親愛(ài)的戰(zhàn)友诽偷,你好,今天想和你聊聊我最近的遇到的困惑疯坤,就是怎樣可以很好的輸出报慕?怎樣可以將寫作程序化,寫作真的可以程序...
    一啊O閱讀 952評(píng)論 0 1