單點登入步驟:
使用者訪問應用程式a.com
應用程式a.com重新導向到login.com(認證中心)並帶上對應的應用程式地址
login.com進行資料認證
login.com返回到a.com後面加上一個ticket(令牌)
a.com伺服器得到ticket與login.com進行互動得到使用者的資訊
顯示使用者資訊
主要:
得到使用者資訊要控制伺服器的來源
對ticket進行加密
下面技術兩種單點登入的形式:
同域下面SSO登入
如果我有一個網站頂層網域為:58kankan.cn我要求http://a.58kankan.cn和http://b.58kankan.cn只要其中一個網站登入了我就可以訪問另外一個網站.實現方式如下:將登入的Cookie儲存到58kankan.cn下面就可以了
[php] view plaincopy
setcookie("userName",$uname,time()+3600,'','58kankan.cn');
不同域下面的SSO
原理是在任意一個網域名稱下登入以後,登入系統使用獲得的使用者登入資料分別去請求其他的域的登入介面(具體應用的時候可以通過iframe等方式隱藏的向其他域提交),相應介面返回對應域的cookies資訊,這樣當使用者訪問站群內其他網站的時候,因已經提前擷取了認證cookies因此實現了單點登入
比如sohu的單點登入系統就是採用的此方法,當使用者在sohu旗下的任意網站登入時,首先統一登入到域passport.sohu.com下,登入成功後再使用iframe去請求其域下的passport.sohu.com/sso/crossdomain_all.jsp?action=login檔案,此檔案裡面是一些js的檔案請求,同樣是請求passport.sohu.com域下檔案,而此檔案會讀取cookies資訊,並附加其身份資訊重新導向到其他的域上,其他的域根據附加過來的資訊寫cookies,實現多域的單點登入。退出的時候也是同樣的機制。雖然原理簡單,但涉及到了瀏覽器的隱私機制,ie需要設定特殊的檔案頭才可以正常設定跨域的cookies資訊,詳情可以看下設定P3P頭實現跨域訪問COOKIE,具體就是在重新導向後的url版面設定cookies的時候,首先輸出:
[php] view plaincopy
下面我來看看代碼實現過程:
Success.php代碼如下:
[php] view plaincopy
Croeedomain_all.php代碼如下:
[php] view plaincopy
Crossdomain.php代碼如下:
[php] view plaincopy
58gou網站的setcookie.php代碼如下:
[php] view plaincopy
其實在crossdomain_all.php中的就可以直接向你要發送的網站去設定cookie資訊了,我這邊只是將javascript和iframe弄到了一起呵呵
header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');
$username = $_GET['userName'];
$action = $_GET['action'];
switch ($action){
case 'login':
setcookie("userName",$username,time()+3600,"/","58kankan.cn");
break;
default :
setcookie("userName",'',0,"/","58kankan.cn");
break;
}
if( $_COOKIE['userName'] ){
$username = $_COOKIE['userName'];
$action = $_GET['action'];
$domain = $_GET['domain'];
switch ( $action ){
case 'login':
header("Location:http://".$domain.'/setcookie.php?userName='.$username.'&action='.$action);
break;
case 'logout':
default :
header("Location:http://".$domain.'/setcookie.php?userName='.$username.'&action='.$action);
break;
}
?>
header("Location:/");
}?>
if( $_COOKIE['userName'] ){
$username = $_COOKIE['userName'];
$action = $_GET['action'];
?>
header("Location:/");
}?>
if( $_COOKIE['userName'] ){
$username = $_COOKIE['userName'];
?>
歡迎登入
退出
header("Location:/");
}?>
header('P3P: CP="CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV"');
跨網域設定cookie設定cookie的時候可以分別用到iframe和javascript兩種形式來實行