單點登錄SSO(Single Sign On)說得簡單點就是在一個多系統(tǒng)共存的環(huán)境下沸移,用戶在一處登錄后,就不用在其他系統(tǒng)中登錄,也就是用戶的一次登錄能得到其他所有系統(tǒng)的信任。單點登錄在大型網(wǎng)站里使用得非常頻繁揍庄,例如像阿里巴巴這樣的網(wǎng)站咆蒿,在網(wǎng)站的背后是成百上千的子系統(tǒng)东抹,用戶一次操作或交易可能涉及到幾十個子系統(tǒng)的協(xié)作,如果每個子系統(tǒng)都需要用戶認證沃测,不僅用戶會瘋掉缭黔,各子系統(tǒng)也會為這種重復認證授權的邏輯搞瘋掉。實現(xiàn)單點登錄說到底就是要解決如何產(chǎn)生和存儲那個信任蒂破,再就是其他系統(tǒng)如何驗證這個信任的有效性馏谨,因此要點也就以下兩個:
- 存儲信任
- 驗證信任
如果一個系統(tǒng)做到了開頭所講的效果,也就算單點登錄附迷,單點登錄有不同的實現(xiàn)方式惧互,本文就羅列我開發(fā)中所遇見過的實現(xiàn)方式。
以Cookie作為憑證媒介
最簡單的單點登錄實現(xiàn)方式喇伯,是使用cookie作為媒介喊儡,存放用戶憑證。
用戶登錄父應用之后稻据,應用返回一個加密的cookie艾猜,當用戶訪問子應用的時候,攜帶上這個cookie捻悯,授權應用解密cookie并進行校驗匆赃,校驗通過則登錄當前用戶。
不難發(fā)現(xiàn)以上方式把信任存儲在客戶端的Cookie中今缚,這種方式很容易令人質疑:
- Cookie不安全
- 不能跨域實現(xiàn)免登
對于第一個問題算柳,通過加密Cookie可以保證安全性,當然這是在源代碼不泄露的前提下姓言。如果Cookie的加密算法泄露埠居,攻擊者通過偽造Cookie則可以偽造特定用戶身份查牌,這是很危險的。
對于第二個問題滥壕,更是硬傷纸颜。
通過JSONP實現(xiàn)
對于跨域問題,可以使用JSONP實現(xiàn)绎橘。
用戶在父應用中登錄后胁孙,跟Session匹配的Cookie會存到客戶端中,當用戶需要登錄子應用的時候称鳞,授權應用訪問父應用提供的JSONP接口涮较,并在請求中帶上父應用域名下的Cookie,父應用接收到請求冈止,驗證用戶的登錄狀態(tài)狂票,返回加密的信息,子應用通過解析返回來的加密信息來驗證用戶熙暴,如果通過驗證則登錄用戶闺属。
這種方式雖然能解決跨域問題,但是安全性其實跟把信任存儲到Cookie是差不多的周霉。如果一旦加密算法泄露了掂器,攻擊者可以在本地建立一個實現(xiàn)了登錄接口的假冒父應用,通過綁定Host來把子應用發(fā)起的請求指向本地的假冒父應用俱箱,并作出回應国瓮。
因為攻擊者完全可以按照加密算法來偽造響應請求,子應用接收到這個響應之后一樣可以通過驗證狞谱,并且登錄特定用戶乃摹。
通過頁面重定向的方式
最后一種介紹的方式,是通過父應用和子應用來回重定向中進行通信跟衅,實現(xiàn)信息的安全傳遞孵睬。
父應用提供一個GET方式的登錄接口,用戶通過子應用重定向連接的方式訪問這個接口与斤,如果用戶還沒有登錄肪康,則返回一個的登錄頁面,用戶輸入賬號密碼進行登錄撩穿。如果用戶已經(jīng)登錄了磷支,則生成加密的Token,并且重定向到子應用提供的驗證Token的接口食寡,通過解密和校驗之后雾狈,子應用登錄當前用戶。
這種方式較前面兩種方式抵皱,接解決了上面兩種方法暴露出來的安全性問題和跨域的問題善榛,但是并沒有前面兩種方式方便辩蛋。
安全與方便,本來就是一對矛盾移盆。
使用獨立登錄系統(tǒng)
一般說來悼院,大型應用會把授權的邏輯與用戶信息的相關邏輯獨立成一個應用,稱為用戶中心咒循。
用戶中心不處理業(yè)務邏輯据途,只是處理用戶信息的管理以及授權給第三方應用。第三方應用需要登錄的時候叙甸,則把用戶的登錄請求轉發(fā)給用戶中心進行處理颖医,用戶處理完畢返回憑證,第三方應用驗證憑證裆蒸,通過后就登錄用戶熔萧。
如果本文對您有用
請不要吝嗇你們的Follow與Start
這會大大支持我們繼續(xù)創(chuàng)作
「Github」
MZMonster :@MZMonster
JC_Huang :@JerryC8080