1. 程式人生 > 實用技巧 >PHP成長記(三) —— SSO單點登入/登出

PHP成長記(三) —— SSO單點登入/登出

你有沒有遇到過公司每一個產品,都要開發一個使用者系統,浪費開發成本不說,使用者體驗還不好,使用者要記住每一個產品的使用者密碼,每個產品都要重複登入,問題重重,要是能登入一次別的一些列產品就都登入了那該多好,SSO(Single Sign On)單點登入,能幫你解決這些問題。

我在這裡來說一下單點登入實現原理,希望能讓大家對單點登入更瞭解,並應用之。我這裡以phpCAS的例子來說講解。

首先我們想到單點登入可能是通過在根域下設定一個cookie,然後只要在這個域下的都可以共享cookie,這種方式最大的問題就是不能實現跨域(雖然網上有很多跨域的解決方案,比如header方式,但是各個瀏覽器支援的都不是很好),並且很不安全。所以CAS實現了另一種方式——cas server和cas client分離,也就是說單點登入伺服器單獨部署,其他client呼叫它,從而實現單點登入。具體流程如下圖

wKioL1LmEoXAB32OAAKlQIXqKhA161.jpg


1、瀏覽器訪問單點登入的網站,如果session存在就返回資料,如果不存在就跳轉到cas server(一個單獨域名的服務)

2、如果有已經登入過,通過檢測cookie,cas server就會302跳轉通過url返回Ticket(Ticket是隨機且唯一)到網站,如果沒有登入過,就跳轉到cas server登入頁面進行登入,登入成功設定cookie,然後302跳轉返回Ticket到網站,同時cas server會儲存改Ticket、cookie和網站host的對應關係

3、 網站接收到Ticket後通過cas server提供的校驗url去校驗Ticket,cas server確認後返回成功,網站把當前的sessionid換成Ticket(session_id(Ticket)),然後返回瀏覽器請求資料

4、當用戶再訪問網站的時候,就會判斷當前session是否登入


單點登入就說完了,其實沒有太複雜的技術,主要是實現的思想,說完單點登入大家一定想知道的是如何單點登出呢?接下來我再分析一下單點登出的原理:

wKiom1LmGDLTq923AAG-XpjR3Fo623.jpg

1、使用者點選登出,網站先清除當前網站的session資訊,然後跳轉到cas server退出URL

2、cas server接收到登出請求後刪除cookie或session資訊,並且通過單點登入時候記錄的cookie和host、Ticket對應關係,遍歷host給網站傳送post登出請求(這裡有一個Tip,就是在cas server退出頁面通過iframe等方式把向所有host發出退出請求

)

3、網站接收到登出請求後,獲取Ticket,並且把Ticket換成當前的sessionid,模擬使用者登入,然後銷燬session完成登出


以上是本人通過研究phpCAS獲得的結論,這個只是最基本的模式,還有很多複雜模式,比如代理模式等等,有經驗的朋友歡迎交流!

謝謝!




轉載於:https://blog.51cto.com/weijingwu/1355109