單點登錄的三種實現方式

轉載地址:傳送門

單點登錄SSO(Single Sign On)說得簡單點就是在一個多系統共存的環境下,用戶在一處登錄後,就不用在其他系統中登錄,也就是用戶的一次登錄能得到其他所有系統的信任。單點登錄在大型網站裏使用得非常頻繁,例如像阿里巴巴這樣的網站,在網站的背後是成百上千的子系統,用戶一次操作或交易可能涉及到幾十個子系統的協作,如果每個子系統都需要用戶認證,不僅用戶會瘋掉,各子系統也會爲這種重複認證授權的邏輯搞瘋掉。實現單點登錄說到底就是要解決如何產生和存儲那個信任,再就是其他系統如何驗證這個信任的有效性,因此要點也就以下兩個:

1. 存儲信任
2. 驗證信任

如果一個系統做到了開頭所講的效果,也就算單點登錄,單點登錄有不同的實現方式,本文就羅列我開發中所遇見過的實現方式。

初級:以Cookie作爲憑證媒介


最簡單的單點登錄實現方式,是使用cookie作爲媒介,存放用戶憑證。用戶登錄父應用之後,應用返回一個加密的cookie,當用戶訪問子應用的時候,攜帶上這個cookie,授權應用解密cookie並進行校驗,校驗通過則登錄當前用戶。

不難發現以上方式把信任存儲在客戶端的Cookie中,這種方式很容易令人質疑:

1. Cookie不安全
2. 不能跨域實現免登

對於第一個問題,通過加密Cookie可以保證安全性,當然這是在源代碼不泄露的前提下。如果Cookie的加密算法泄露,攻擊者通過僞造Cookie則可以僞造特定用戶身份,這是很危險的。對於第二個問題,更是硬傷。

中級:通過JSONP實現


對於跨域問題,可以使用JSONP實現 傳送門:(如果不知道JSONP是什麼?)用戶在父應用中登錄後,跟Session匹配的Cookie會存到客戶端中,當用戶需要登錄子應用的時候,授權應用訪問父應用提供的JSONP接口,並在請求中帶上父應用域名下的Cookie,父應用接收到請求,驗證用戶的登錄狀態,返回加密的信息,子應用通過解析返回來的加密信息來驗證用戶,如果通過驗證則登錄用戶。

這種方式雖然能解決跨域問題,但是安全性其實跟把信任存儲到Cookie是差不多的。如果一旦加密算法泄露了,攻擊者可以在本地建立一個實現了登錄接口的假冒父應用,通過綁定Host來把子應用發起的請求指向本地的假冒父應用,並作出迴應。因爲攻擊者完全可以按照加密算法來僞造響應請求,子應用接收到這個響應之後一樣可以通過驗證,並且登錄特定用戶。

高級:通過頁面重定向的方式


最後一種介紹的方式,是通過父應用和子應用來回重定向中進行通信,實現信息的安全傳遞。 父應用提供一個GET方式的登錄接口 A (此時的父應用接口固定,攻擊者無法去僞造),用戶通過子應用重定向連接的方式訪問這個接口,如果用戶還沒有登錄,則返回一個的登錄頁面,用戶輸入賬號密碼進行登錄。如果用戶已經登錄了,則生成加密的Token,並且重定向到子應用提供的驗證Token的接口 B (此時的子應用接口固定,攻擊者無法去僞造),通過解密和校驗之後,子應用登錄當前用戶。

這種方式較前面兩種方式,接解決了上面兩種方法暴露出來的安全性問題和跨域的問題,但是並沒有前面兩種方式方便。安全與方便,本來就是一對矛盾。

總結:使用獨立登錄系統


一般說來,大型應用會把授權的邏輯用戶信息的相關邏輯獨立成一個應用,稱爲用戶中心。用戶中心不處理業務邏輯,只是處理用戶信息的管理以及授權給第三方應用。第三方應用需要登錄的時候,則把用戶的登錄請求轉發給用戶中心進行處理,用戶處理完畢返回憑證,第三方應用驗證憑證,通過後就登錄用戶。

# 附錄

分析:SSO(單點登錄)OAuth2.0(授權) 的區別?

oauth2.0

1、解決的是服務提供方(如:微信等)給第三方應用授權的問題
2、是一種具體的協議,只是爲用戶資源的授權提供了一個安全的、開放而又簡易的標準。OAuth 2.0爲客戶端開發者開發Web應用,桌面端應用程序,移動應用及客廳設備提供特定的授權流程。
3、通俗的講,OAuth是爲解決不同公司的不同產品實現登陸的一種簡便授權方案,通常這些授權服務都是由大客戶網站提供的,如QQ,新浪微博,人人網等。而使用這些服務的客戶可能是大客戶網站,也可能是小客戶網站。使用OAuth授權的好處是,在爲用戶提供某些服務時,可減少或避免因用戶懶於註冊而導致的用戶流失問題

sso

1、解決的是大型系統中各個子系統如何共享登陸狀態的問題
2、是一種技術,可以用cookie實現,在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統
3、通常處理的是一個公司的不同應用間的訪問登陸問題。如企業應用有很多業務子系統,只需登陸一個系統,就可以實現不同子系統間的跳轉,而避免了登陸操作。

參考文獻

傳送門: 單點登錄原理

傳送門: oauth2詳解

發佈了47 篇原創文章 · 獲贊 21 · 訪問量 10萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章