飞嗨,欢迎您的光临,本博所发布之文章皆为作者亲测通过,如有错误,欢迎通过各种方式指正。(本博已于2015.12.6升级到php7,运行环境php7 php-fpm + nginx1.8.0)

sso单点登录

PHP lf 3926℃ 0评论

最近好奇单点登录,于是上网找了一些资料,琢磨了一下…试验了一下,我的想法还不是很完善,并且向服务器的请求次数过多,增加了服务器的负载。

sso未登录前

sso未登录前

sso登录后

sso登录后

 sso,即single logined-on,单点登录。一个集团下的网站,只要在任意一个站点登录,打开其他站点都为登录状态。sso的主要难点在于,浏览器为了安全考虑,不允许跨域读取cookie,让各个网站都能够识别彼此种下的cookie,并让各服务器之间共享session(我想到的是用memcache或者数据库),便能实现单点登录了。

      出于简单考虑,认证都是引导用户统一至passport.a.com/sso.php下认证,如果想保持自己独立的登录页面,可以用js建立一个iframe向passport.a.com认证,然后根据返回值,再次把cookie写到该网址下。

       在所有网站,先判断一下是否存在本域登录的cookie,如果存在则直接根据cookie读取session信息,如果不存在,则重定向到passport.a.com/sso.php,并在url带上?callback=$_SERVER[‘HTTP_HOST’],检查是否有passport.a.com域的coookie,若存在,则跳转回callback,callback页面为设置登录信息,即写入cookie实现登录。

        我之前有想过,直接在passport.a.com下,设置b.com的cookie,然后跳转会www.a.com/index.php,但是发现虽然加了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,这个等待有空再多验证几次是否可以。

1.所有的登录请求都去passport.a.com/sso.php

[code]

if($_GET[‘callback’] != ”)
{
if($_COOKIE[‘islogin’] != ”){
//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”‘);
//setcookie(“islogin”, ‘ddddddddd’, time()+3600, “/”, “www.a.com”);
header(“location:{$_GET[‘callback’]}/?action=setcookie”);
//header(“location:{$_GET[‘callback’]}”);
}else{
echo ‘passport.a.com已登录;
}
}
if($_GET[‘action’] == ‘login’) setcookie(‘islogin’,’logined’);
if($_GET[‘action’] == ‘logout’) setcookie(‘islogin’,”);
var_dump($_COOKIE);

passport_sso

passport.a.com/sso.php

[/code]

2.另一个域名www.a.com/index.php

[code]

<?php
//var_dump($_COOKIE);die;
if($_GET[‘action’] == ‘setcookie’)
{
setcookie(‘islogin’,’sso登陆来的cookie’);
}
if($_COOKIE[‘islogin’])
{
echo ‘a.com已经有cookie了';
}else{
header(“location:http://passport.a.com/sso.php?callback=http://{$_SERVER[‘HTTP_HOST’]}”);
}
if($_GET[‘action’] == ‘logout’)
{
setcookie(‘islogin’,”);
}
var_dump($_COOKIE);
?>

a_cookie

www.a.com

[/code]

3.另一个域名www.b.com/index.php

[code]

<?php
//var_dump($_COOKIE);die;
if($_GET[‘action’] == ‘setcookie’)
{
setcookie(‘islogin’,’sso登陆来的cookie’);
}
if($_COOKIE[‘islogin’])
{
echo ‘a.com已经有cookie了';
}else{
header(“location:http://passport.a.com/sso.php?callback=http://{$_SERVER[‘HTTP_HOST’]}”);
}
if($_GET[‘action’] == ‘logout’)
{
setcookie(‘islogin’,”);
}
var_dump($_COOKIE);
?>

b_cookie

www.b.com

[/code]

转载请注明:飞嗨 » sso单点登录

喜欢 (1)or分享 (0)

Warning: Use of undefined constant PRC - assumed 'PRC' (this will throw an Error in a future version of PHP) in /work/php/blog/wp-content/themes/yusi1.0/comments.php on line 17
发表我的评论
取消评论

表情
粤ICP备15018643号-1