多域名同步登录,单点登录SSO

【多个域名+1个登录域名。登录成功后将其他多个域名分配SESSION值,即实现了多域名同时登录的情况。登出同理!】

session_start();//这里 会默认创建一个COOKIE名为:PHPSESSID
//$_SESSION['a'] = 'A';
//print_r($_SERVER);exit;

	//单点登录接口,向其他域名发送同步登录数据。
	if(isset($_SESSION['a']) && $_SERVER['HTTP_HOST'] == 'www.a.com') 
	{
		//【--------------第1种方法----------】 仅适用于当前域名的所有子域名。只要设置domain参数即可
		//这里可以把cookie的值保存到数据库表中。当用户每次请求时,查询表中是否有该 ck_a_value ,如果有的话则认为是登录状态。
		setcookie('ck_a_key','ck_a_value_uid_1',time()+300, '/', 'a.com');
		//setcookie('ck_a_key','ck_a_value_uid_1',time()+300);

		//【--------------第2种方法----------】 用iframe,该方法范围更广。可适用于其他域名。
		//echo '<iframe src="http://t1.a.com/a.php?ssid='.$_SESSION['a'].'">';		
	}


print_r($_COOKIE);
echo '<br><br>';
print_r($_SESSION);


if(isset($_GET['ssid']))
{
	$_SESSION['a'] = $_GET['ssid'];
}

exit;


假设你有三个不同域名,a.com, b.com, http://c.com,将其中之一作为真正的登陆入口,所有的域名下发起的登陆,全部重定向到这个节点,这里假设选择http://a.com/login.php为统一登入节点,为了方便说明,把http://a.com叫做主节点,其余叫做从节点。 假设现在从任意站点发出登陆请求,最终都被带到 http://a.com/login.php?from=b.com&sfkey=xxxxxx,用户输入登陆信息,假设登陆成功,返回一个登陆成功中间页面,在这个页面里,包含下面html代码 width="0" height="0" src="https://b.com/sso.php?sessid=xxxxxxxxxxxx&sfkey=xxxxxxxxxxx">> width="0" height="0" src="https://c.com/sso.php?sessid=xxxxxxxxxxxx&sfkey=xxxxxxxxxxx">>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 idsession_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做且仅作登陆服务。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章