php單點登錄如何實現
01-26
你給我私信里說域名不是簡單父子域名的關係,所以直接的cookie共享是不可行的。提供一種比較好做的方案,假設你有三個不同域名,a.com, b.com, http://c.com,將其中之一作為真正的登陸入口,所有的域名下發起的登陸,全部重定向到這個節點,這裡假設選擇http://a.com/login.php為統一登入節點,為了方便說明,把http://a.com叫做主節點,其餘叫做從節點。
假設現在從任意站點發出登陸請求,最終都被帶到 http://a.com/login.php?from=b.comsfkey=xxxxxx,用戶輸入登陸信息,假設登陸成功,返回一個登陸成功中間頁面,在這個頁面里,包含下面html代碼&
&
sessid是登陸成功以後的session ID,sfkey是一個安全碼,這兩個串在login.php里綁定到當前登陸的用戶記錄上。
這個時候http://a.com實際已經登陸完畢,獲得了PHPSESSID的cookie。兩個iframe的作用是把獲得的session id立刻同步到從節點上,從節點的sso.php獲得sessid和sfkey後,首先校驗這個配對是否存在,如果存在,立刻把sessid值設為當前session idsession_id($_GET[sessid]); // 使用a.com產生的session id
session_start();
sso.php請求完畢後,b.com和c.com這兩個站點就獲得了和a.com一樣的PHPSESSID cookie;
這個頁面會把用戶重定向回所來自的頁面(到達login.php的時候記住了),重定向完成後,用戶已經在所有網站完成了同步登陸。
http://a.com發送iframe請求的時候使用加密的sessid=xxxxxx里的sessid,從節點的sso.php獲取密文後解密才獲得真實的session id
你可以用單獨域名來作為登陸主節點,比如http://login.x.com,而不用a b c中的任意一個,http://login.x.com做且僅作登陸服務。如果你的要求不高 ucenter是一種解決方案
如果不考慮異地部署話,可以將用戶登錄信息統一存在服務端的共享存儲里,memcache或者redis都是可以的;當用戶由http://a.com跳轉到http://b.com之前在url中生成一個加密串,加密串中存放相應的登錄信息key及校驗信息。用戶跳轉到http://b.com後解密url中的參數並去共享存儲中獲取用戶登錄信息。當然,如果需要相對安全一些,可以對用戶在http://a.com時的sid、ip之類的信息進行驗證,同時控制url中登錄參數的生命周期。驗證通過後再在http://b.com的伺服器上寫入本地登錄信息。退出的時候註銷掉共享存儲中的登錄信息即可。上述url中的登錄參數作用類似於cas這類sso解決方案中的ticket。
說一個不同的答案吧——廣播機制。同樣,以http://a.com作為主域名,不論http://b.com還是http://c.com登錄時請求都提交到http://a.com,所有的存儲都在http://a.com,其他域名不允許訪問。在http://a.com登錄成功後,將登錄信息存放在http://a.com域下的cookie中。此時發起廣播,由client端通知http://b.com和http://c.com,說用戶已經登錄(僅僅是告訴他們已經登錄),此時用戶訪問http://b.com或者http://c.com時有server端向http://a.com請求獲取用戶信息,並將非敏感信息存儲到自己的存儲當中。同理,登出時也是向http://a.com發起登出請求,http://a.com將用戶cookie清掉,http://b.com和http://c.com再次向http://a.com請求驗證用戶身份時,則驗證失敗。
給你說個絕對好用的。假設你需要登陸的域名都不能,可以使用nginx的rewrite模塊,把域名都指向主從關係下面
設計單點登錄系統時,註冊是怎麼處理的?由單點登錄系統對外提供註冊介面?還是各個子系統分別對外提供註冊介面? @黃輝馮, @罒罓罒
不錯!
最後的結果呢?
倉庫: 233sec/laravel-oauth-server
客戶端: 用這個 league/oauth2-client 即可截圖:占坑… 等自己博客更新後來埋答案
正在實現中.... 別催了... 做完了會開源的(其實大部分輪子基於別人開源的東西)沒有樓上那些說的那麼複雜。一般兩種方案:1 共享SESSION(db,nosql等)2 通過介面對每個域名下寫cookie(常見ucenter)。至於那些在頁面上做處理,不現實的。一則涉及面廣,二則維護不方便,也不符合業務封裝(模塊化)的架構思維。
登錄狀態存資料庫,每次登陸的時候查詢一下是都已經登錄。
推薦閱讀:
※買量防刷防假的策略一般有哪些,可否舉些實例?
※新手學習php到可以工作,哪些技術是必備的?
※當面試官問「談談對MVC的理解」「MVC的架構」「XXX層的實現原理」時,面試官究竟是想聽到什麼答案?
※為什麼很少有人在 PHP 項目中使用 namespace ?