目錄一、總述 關(guān)于沒有后續(xù)更新的問題各位,實(shí)在抱歉!SSO原本是我的畢業(yè)設(shè)計(jì),但是出于某個(gè)原因,我決定留級(jí),畢設(shè)暫時(shí)擱淺!這段時(shí)間忙著準(zhǔn)備面試的事情,系統(tǒng)學(xué)習(xí)前端中ing! 這是這個(gè)系列被擱淺的原因之一!另一個(gè)原因在于,我發(fā)現(xiàn)沒有經(jīng)歷過企業(yè)開發(fā),真的在某些環(huán)節(jié)上很難理解SSO中一些讓我非常困惑的問題!比如,我一直困惑的這個(gè)問題,這非常有可能是一個(gè)很簡(jiǎn)單的問題,但是我往往是被這種問題困惑住。比如,“性能”問題,大四實(shí)習(xí)年一直沒在IT企業(yè),討論“性能”心里很虛,我更想接觸一定的開發(fā)之后,心里更加有底的寫下問題的答案。沒出問題的話,這個(gè)系列會(huì)在6月中旬繼續(xù)更新,希望8月能搞定。 經(jīng)商之道今天我要講兩個(gè)故事,一家高級(jí)商場(chǎng)的故事和一家普通商場(chǎng)的故事。 1.高級(jí)商場(chǎng)的故事從前有個(gè)老板叫C/S,他開了這樣一家高級(jí)商場(chǎng)叫“TCP/IP Server"。專門服務(wù)注冊(cè)了VIP的顧客。他們對(duì)待注冊(cè)了VIP的顧客的服務(wù)非常的高級(jí)。怎樣高級(jí)?每一位VIP顧客進(jìn)來購(gòu)物,就會(huì)有一個(gè)服務(wù)員全程陪同。這些服務(wù)員提供所有的服務(wù),非常的有才能。但就是都很沒有記性,永遠(yuǎn)都記不住自己是在服務(wù)哪位顧客。這也怪不得服務(wù)員,誰叫每個(gè)VIP顧客都長(zhǎng)得一模一樣呢?于是老板就讓服務(wù)員全程牽著顧客的手,并且手里拿著一張紙條,紙條上面寫著顧客的姓名、性別、年齡、余額等等信息。這樣他們就能叫出顧客的尊稱,而且因?yàn)闋恐?,所以不至于跟顧客走丟。真為這一群奇葩著急啊ヽ( ̄д ̄;)ノ!!!這些服務(wù)員這一群體被學(xué)術(shù)家們稱為“progress”,而顧客這一群體被學(xué)術(shù)家們稱為“client” 我很好奇高級(jí)商場(chǎng)賣的都是些什么東西。從商業(yè)角度來說,全程一對(duì)一的服務(wù)成本可真高啊。 2.普通商場(chǎng)的故事后來,有一個(gè)老板叫B/S,他覺得C/S是個(gè)傻X,全程一對(duì)一的服務(wù)成本高,收益小。于是他開了一家普通的商場(chǎng)叫"HTTP Server"。跟"TCP/IP Server"商場(chǎng)一樣,他的"HTTP Server"也是需要注冊(cè)VIP的。但是他的服務(wù)員們并不會(huì)全程陪同顧客購(gòu)物。總的來說,他們提供兩樣服務(wù):1.詢問 2.收銀。每個(gè)服務(wù)員在處理完某個(gè)顧客的詢問服務(wù)或者收銀服務(wù)后,就可以為另一個(gè)顧客服務(wù)。"B/S"以為它的商場(chǎng)會(huì)比那個(gè)沒頭腦的“C/S”的商場(chǎng)收益更好!很顯然嘛,一樣多的服務(wù)員,他的店能服務(wù)更多的顧客。 天真的B/S,可憐的B/S。他差點(diǎn)就破產(chǎn)了~ 還不是那群讓人著急的服務(wù)員!開張第一天,他們就惹來了滿滿的差評(píng)。他們總是記不住顧客買了什么東西,根本沒有辦法收銀;而且顧客上前要詢問他們“node.js的產(chǎn)品在哪個(gè)貨架?”、“Python有多少種框架產(chǎn)品?”等問題的時(shí)候,這群服務(wù)員總是沒有辦法先叫出顧客的名字來給予顧客問候。顧客覺得他們都很沒有禮貌~~~這也怪不得服務(wù)員,健忘是他們的天性,更何況每個(gè)顧客的相貌、穿著、聲音又都完全一樣,他們可是要一個(gè)人服務(wù)多個(gè)顧客的! B/S決定關(guān)店整改!!!他給每個(gè)服務(wù)員配備了一個(gè)記錄器。有一個(gè)服務(wù)員專門負(fù)責(zé)把進(jìn)店的會(huì)員信息寫進(jìn)記錄器,然后把一串唯一的ID寫在一種叫做cookie的紙上,把紙貼在顧客額頭上......沒錯(cuò),貼在額頭上。其它服務(wù)員只要往記錄器輸入顧客頭上的ID,就能查詢到顧客的信息,這樣服務(wù)員就不會(huì)因?yàn)榻胁怀鲱櫩偷拿直徽f沒禮貌了;并且可以把顧客要買的東西,臨時(shí)的記錄在記錄器里面。當(dāng)然啦,記錄器里的記錄是整個(gè)商場(chǎng)共享的。所以,即便顧客A買《黑客與畫家》的時(shí)候是服務(wù)員A給記錄的,買《寫給大家看的設(shè)計(jì)書》的時(shí)候是服務(wù)員B給記錄的,結(jié)算的時(shí)候又是服務(wù)員C,他們搞錯(cuò)了。 B/S非常自豪的把這種記錄器機(jī)制叫做session機(jī)制,真搞不懂他為什么要這么叫。就這樣,B/S的“HTTP Server”商場(chǎng)以更低的成本獲得了更大的收益~ 他發(fā)跡了。 登錄這件事登錄就是通過驗(yàn)證(密碼驗(yàn)證、指紋驗(yàn)證、聲音驗(yàn)證、人面驗(yàn)證、DNA驗(yàn)證...),向服務(wù)端表明你是誰?并且讓服務(wù)端記住你是誰。對(duì)于C/S的架構(gòu)來說,要記住你是誰太容易了~ 客戶端跟服務(wù)端建立的TCP/IP連接就能很好的表明你誰,一個(gè)進(jìn)程服務(wù)一個(gè)客戶端,只要在進(jìn)程空間里寫個(gè)變量就OK了!但是對(duì)于B/S架構(gòu)來說,因?yàn)槭菬o狀態(tài)的,服務(wù)一結(jié)束就斷開(現(xiàn)在的長(zhǎng)連接也還是會(huì)斷),要記住你是誰真心太不容易了~ 所以只能由客戶端來告訴服務(wù)端:“我是誰?!?,也就是給客戶端一個(gè)ID,然后服務(wù)端有個(gè)全局的空間(session)用于記錄ID對(duì)于的信息,類似于Map<ID, infomations>。對(duì)于每一次的服務(wù)請(qǐng)求,服務(wù)端都要拿著客戶端給的ID,去session查詢這個(gè)ID是不是登錄了,如果是則怎樣怎樣,如果不是就叫用戶登錄(假設(shè)每個(gè)頁面的訪問都要求用戶登錄)。拿著ID去session查詢ID是不是登錄了這個(gè)過程我們把它叫做檢驗(yàn),這點(diǎn)先提前說明下,有點(diǎn)重要!登錄成功后,就把這個(gè)ID做一個(gè)標(biāo)記,表示登錄。什么樣的標(biāo)記?你可以在這個(gè)ID的session空間里設(shè)置一個(gè)變量叫 什么是單點(diǎn)登錄(Single Sign-On)很早期的公司,一家公司可能只有一個(gè)Server,慢慢的Server開始變多了。每個(gè)Server都要進(jìn)行注冊(cè)登錄,退出的時(shí)候又要一個(gè)個(gè)退出。用戶體驗(yàn)很不好!你可以想象一下,上豆瓣 要登錄豆瓣FM、豆瓣讀書、豆瓣電影、豆瓣日記......真的會(huì)讓人崩潰的。我們想要另一種登錄體驗(yàn):一家企業(yè)下的服務(wù)只要一次注冊(cè),登錄的時(shí)候只要一次登錄,退出的時(shí)候只要一次退出。怎么做? 一次注冊(cè)。 一次注冊(cè)不難,想一下是不是只要Server之間同步用戶信息就行了?可以,但這樣描述不太完整,后續(xù)講用戶注冊(cè)的時(shí)候詳細(xì)說。實(shí)際上用戶信息的管理才是SSO真正的難點(diǎn),只是作為初學(xué)者,我們的難點(diǎn)在于實(shí)現(xiàn)SSO的技術(shù)!我們先討論實(shí)現(xiàn)手段。 一次登錄與一次退出。 回頭看看普通商場(chǎng)的故事,什么東西才是保持登錄狀態(tài)關(guān)鍵的東西?記錄器(session)?那種叫做cookie的紙張?寫在紙張上的ID? 是session里面記錄的信息跟那個(gè)ID,cookie只不是記錄ID的工具而已??蛻舳顺钟蠭D,服務(wù)端持有session,兩者一起用來保持登錄狀態(tài)??蛻舳诵枰肐D來作為憑證,而服務(wù)端需要用session來驗(yàn)證ID的有效性(ID可能過期、可能根本就是偽造的找不到對(duì)于的信息、ID下對(duì)應(yīng)的客戶端還沒有進(jìn)行登錄驗(yàn)證等)。但是session這東西一開始是每個(gè)server自己獨(dú)有的,豆瓣FM有自己的session、豆瓣讀書有自己的session,而記錄ID的cookie又是不能跨域的。所以,我們要實(shí)現(xiàn)一次登錄一次退出,只需要想辦法讓各個(gè)server的共用一個(gè)session的信息,讓客戶端在各個(gè)域名下都能持有這個(gè)ID就好了。再進(jìn)一步講,只要各個(gè)server拿到同一個(gè)ID,都能有辦法檢驗(yàn)出ID的有效性、并且能得到ID對(duì)應(yīng)的用戶信息就行了,也就是能檢驗(yàn)ID。 單點(diǎn)登錄的實(shí)現(xiàn)方法(server端)以server群如何生成、驗(yàn)證ID的方式大致分為兩種:
單點(diǎn)登錄的實(shí)現(xiàn)方法(瀏覽器端)單點(diǎn)登錄還有非常關(guān)鍵的一步,這一步跟server端驗(yàn)證token的方式無關(guān),用最早的“共享session”的方式還是現(xiàn)在的“token”方式,身份標(biāo)識(shí)到了瀏覽器端都要面臨這樣的一個(gè)問題:用戶登錄成功拿到token(或者是session-id)后怎么讓瀏覽器存儲(chǔ)和分享到其它域名下?同域名很簡(jiǎn)單,把token存在cookie里,把cookie的路徑設(shè)置成頂級(jí)域名下,這樣所有子域都能讀取cookie中的token。這就是共享cookie的方式(這才叫共享Cookie嘛,上面那個(gè)應(yīng)該叫共享session)。比如:谷歌公司,
SSO-Token方式的服務(wù)端流程實(shí)際上,基本是用Token代替session的方式,也有非常多種實(shí)現(xiàn)方法。圖片是我先去自己實(shí)驗(yàn)時(shí)的方案。 SSO-Server負(fù)責(zé)用戶的登錄(當(dāng)然也有注冊(cè)、修改基本用戶信息、退出功能),它的作用有兩點(diǎn):
我們要實(shí)現(xiàn)什么樣的SSO
|
|