單一登入SSO是指在多個應用系統中,使用者只需要登入一次就可以存取所有互信的應用系統,是企業業務整合的解決方案之一,其優點:1、提高使用者的效率;2、提高開發人員的效率;3、簡化管理。
很早期的公司,一家公司可能只有一個Server,慢慢的Server開始變多了。每個Server都要進行註冊登錄,退出的時候又要一個個退出。使用者體驗很不好!你可以想像一下,上豆瓣 要登入豆瓣FM、豆瓣讀書、豆瓣電影、豆瓣日記......真的會讓人崩潰的。我們想要另一種登入體驗:一家企業下的服務只要一次註冊,登入的時候只要一次登錄,退出的時候只要一次退出。怎麼做?
一次註冊。一次註冊不難,想一下是不是只要Server之間同步使用者資訊就行了?可以,但這樣描述不太完整,後續講用戶註冊的時候詳細說。實際上使用者資訊的管理才是SSO真正的困難,只是作為初學者,我們的困難在於實現SSO的技術!我們先討論實現手段。
一次登入與一次登出。回頭看看普通商場的故事,什麼東西才是保持登入狀態關鍵的東西?記錄器(session)?那種叫做cookie的紙張?寫在紙張上的ID? 是session裡面記錄的資訊跟那個ID,cookie不只是記錄ID的工具而已。客戶端持有ID,服務端持有session,兩者一起用來保持登入狀態。客戶端需要用ID來當作憑證,而服務端需要用session來驗證ID的有效性(ID可能過期、可能根本就是偽造的找不到對應的資訊、ID下對應的客戶端還沒有進行登入驗證等)。但session這東西一開始是每個server自己獨有的,豆瓣FM有自己的session、豆瓣讀書有自己的session,而記錄ID的cookie又是不能跨域的。所以,我們要實現一次登入一次退出,只需要想辦法讓各個server的共用一個session的信息,讓客戶端在各個網域下都能持有這個ID就好了。再進一步講,只要各個server拿到同一個ID,都能有辦法檢驗出ID的有效性、並且能得到ID對應的用戶資訊就行了,也就是能檢驗ID;
##單一登入實作方法
server端以server群如何產生、驗證ID的方式大致分為兩種:「共享Cookie」這個就是上面提到的共享session的方式,我倒覺得叫「共享session」來好一點,本質上cookie只是儲存session-id的介質,session-id也可以放在每一個請求的url裡。據說這種方式不安全,我沒去細究,哪位大神可以推薦下相關的資料,我後期補上。其實也是,畢竟session這項機制一開始就是一個server一個session的,把session拿出來讓所有server共享確實有點奇怪。 SSO-Token方式因為共享session的方式不安全,所以我們不再以session-id作為身分的識別。我們另外產生一種標識,把它取名SSO-Token(或Ticket),這種標識是整個server群唯一的,並且所有server群都能驗證這個token,同時能拿到token背後代表的用戶的信息。我們要討論的也是這種方式,一會上具體流程圖。 瀏覽器端單一登入還有非常關鍵的一步,這一步跟server端驗證token的方式無關,用最早的「共享session」的方式還是現在的「token 」方式,身分識別到了瀏覽器端都要面臨這樣的一個問題:使用者登入成功拿到token(或者是session-id)後怎麼讓瀏覽器儲存和分享到其它網域下?同域名很簡單,把token存在cookie裡,把cookie的路徑設定成頂級網域下,讓所有子網域都能讀取cookie中的token。這就是共享cookie的方式(這才叫共享Cookie嘛,上面那個應該叫共享session)。例如:Google公司,google.com是他的頂級域名,信箱服務的mail.google.com和地圖服務的map.google.com都是它的子網域。但是,跨域的時候怎麼辦?谷歌公司還有一個域名,youtube.com,提供視訊服務 。 推薦教學:《PHP》
#
以上是單一登入是什麼意思?的詳細內容。更多資訊請關注PHP中文網其他相關文章!