sso全稱single sign on,單點登入.用於實現多系統的登入認證.說白了就是只要乙個賬號就可以訪問阿里旗下支付寶,**, 天貓等**.站在企業的角度這樣做有乙個好處:只要有乙個系統負責登入模組,其他的子系統就可以專注於自己系統的業務邏輯,需要的時候請求認證系統就可以.站在使用者的角度好處在於只要乙個賬號就可以訪問其公司旗下所有產品.
sso有多種實現方案,這次我們來分析一下其中的一種可行方案.並且擼起袖子**實現一遍.其實現效果如下
在實現之前,我們來分析一下整個流程.
通常情況下,系統判斷使用者是否登入都是校驗session.在sso架構中,判斷使用者是否登入仍然依靠session,但是session由sso server維護, session_id由client保持,client直接訪問的卻是業務系統.
在這樣的情況下,要想能夠使用session進行登入驗證. 假設client訪問業務系統,業務系統取得其session_id,然後把session_id提交到sso server進行驗證.我們看到這裡的業務系統充當了乙個proxy的角色,下文以proxy指代各個業務系統.
這種方式簡單粗暴,但是有乙個很大的侷限性 : client持有的session_id由sso server發布的,proxy跟sso server必須持有相同網域名稱,不然proxy無法獲取到client的session_id.所以需要在這種思路上做一點改變.
client訪問proxy,proxy隨機生成乙個token作為cookie儲存,並且sso server維護有乙個以token為檔名的檔案,檔案儲存了client訪問sso server生成的session id.當proxy需要驗證client身份,只要獲取到token,到sso server訪問token檔案,獲取到session id.那麼久可以訪問到session資料.從而判斷該client是否已經登入.
總體設計思路如上,但是除了token,為了保證安全性,以及多個proxy之間不會產生衝突.乙個完整的流程應該如下 :
上述的重定向url應該類似www.sso.com?token=***&command=***&returnurl=***&proxy=proxya&checksum=***
.client被proxya重定向到sso server之後,sso校驗引數的合法性後為client生成乙個session_id.並且建立乙個以proxyid-token-checksum的命名的檔案,儲存當前client的session id.完成上述操作之後引導client重定向到returnurl.這樣使用者的體驗不會受到影響.
client重定向到proxya後可以進行登入操作,proxya可以從cookie中獲取到token.client提交使用者名稱跟密碼,proxya重新生成乙個proxyid-token-checksum的字串,然後和使用者名稱密碼一起提交到sso server.
sso server收到proxya的請求之後校驗請求的合法性,然後獲取到proxyid-token-checksum檔案中的session_id.在驗證使用者密碼之後把登入資訊以proxyid--->username的形式寫到session中.之後返回使用者資訊給proxya.
proxya受到sso server的使用者資訊之後,判斷登入成功.
當使用者在多個proxy上登入,就會在sesion中維護多個proxyid--->username的鍵值對資訊.使用者從乙個系統退出,proxy**client向sso server發起退出請求.sso server按照上面的步驟獲取到session id.刪除掉所有的session資料.這樣其他proxy的登入資訊也被刪除.下次訪問需重新登入.
上面的流程都清楚了,下面來嘗試用**實現
首先必然得有兩個模組,proxy跟sso server.為了能在機子上執行處效果,需要配置虛擬主機,如果想提前看到效果, 可以在這裡的sso目錄下找到全部原始碼,在apache下配置好www.a.com, www.b.com以及www.sso.com三個**,並且在/etc/hosts下配置www.sso.com的ip位址.然後把sso目錄下的三個子資料夾分別放到對應目錄下.
整個系統中,proxy在三種情況下會請求sso
好了,整個sso的分析就到這裡了,原始碼在github可以找到, 而且, 如果懂得上面的認證流程,看懂**是很簡單的事情.
單點登入系統SSO實現
前些天被問到單點登入了,而據我當時做的這個模組兩年了,現在重新溫習並記錄下,方便以後快速回憶起來 sso全稱single sign on。sso是使用者只需要登入一次就可以訪問所有相互信任的應用系統 分布式集群的專案因為每個模組都部署在不同的機器。如果第一次在a系統登入,第二次訪問b系統,這個時候b...
如何實現乙個UI系統
如何為我的遊戲實現乙個ui系統,這個問題我想了很久,不過我現在可不像開始的時候那樣一點思路也沒有。如果你也被這個問題所困擾,我十分樂意與你分享這幾天來的學習成果。嘿嘿,我是不是有點得意忘形了?在開始之前,我要提醒你,學而不思則惘。在看這篇文章的時候,請時刻保持頭腦清醒,如果有什麼不太明白的話,請停下...
乙個推薦系統的實現
乙個kaggle題目 一 資料集 2220895個使用者 6095 item 73209277個訓練樣本,34910937個測試樣本 a 訓練集 rec log train.txt userid itemid result 1or 1 timestamp 四列特徵。b 測試集,同上 1 user p...