SSO 单点登录 ,你用PHP是如何去做的呢 ?

一、什么是单点登录SSO(Single Sign-On)
SSO是一种统一认证和授权机制,指访问同一服务器不同应用中的受保护资源的同一用户,只需要登录一次,即通过一个应用中的安全验证后,再访问其他应用中的受保护资源时,不再需要重新登录验证。

二、单点登录解决了什么问题
解决了用户只需要登录一次就可以访问所有相互信任的应用系统,而不用重复登录。

例如CSDN中的论坛应用,博客应用,下载应用模块。我们只要在CSDN中访问任何一个子应用后,再访问其他应用站点的时候就不需要在进行登录。

三、在公司里面也通过.NET,进行了SSO的开发。
在网上看过不少的SSO实现方法。总结在实际项目开发中的一些开发体会。先看下面的流程图:
图片

对上图的详解
一.用户第一次访问站点。

  1. 用户第一次访问>www.a.com ,这个时候该站点下没有记录之前登录的Cookie。

  2. 所有在发现没有用户登录的情况下>跳转到了Login 页面。

  3. 用户现在输入用户名,密码登录,请求SSO登录API,登录成功,在Redis里面缓存一条Key=SessioID,Values=UserInfo这样一条记录,缓存时间可配置。Response 返回登录验证状态,和用户信息。

  4. 用户登录成功,记录下凭证,即此刻的SessionID写入Cookie.然后跳转到www.a.com。

  5. 这个时候有了Cookie,将记录的Cookie,也就是SessioID请求SSO验证Token接口,因为登录成功记录了Key=SessionID,所有可以获取到Values=即用户信息,Response 返回用户信息。

  6. 用户现在去访问www.B.com站点,B站点无Cookie,这里SessionID还是当前会话的SessionID,所有区请求SSO主站点验证Token接口,发现存在Key=SessionID,返回登录状态成功,用户信息。在B站点下记录Cookie 即token 配置。

这样用户第一次访问A站点,从第一次登录,到访问其他站点的流程就走完了。

二.用户中途关闭浏览器,然后打开浏览器,访问B站点:

  1. 发现存在Cookie, 即Token凭证,去SSO主站的,验证发现存在Key=SessioID,获取Values将UserIno返回给用户,返回用户任在登录状态。这样访问应用之前访问过的站点依旧在登录状态。

  2. 如果用户在执行访问第二个应用,这时候Redis缓存的登录状态过期,则返回验证凭证失败。这时候第二个应用跳转到登录状态,走用户登录的流程以及后续验证流程。

注意记录Cookie的过期时间应该保证与Redis的过期时间一致性,不能在Redis缓存的过期时间之后过期,这样在用户此时访问第一个应用站点的时候,发现Cookie不存在,就会通过SessionID去验证凭证,发现这时候是过期后重新登陆,会将此时的登陆状态写入Cookie.

三.登出
只需要清除本地Cookie,调用SSO站点接口清除登陆缓存的状态即可实现登出。

四.注意:
在实际的项目开发中会遇到各种情况,比如子站点和SSO主站点的接口调用参数约束,签名,加密等。以及纯html站点的实现SSO登录接口,或者纯php应用网站的跳转接口,这些都要区别开来。只有在详细了解SSO实现单点登录的原理之后进行开发才能做到事半功倍的效果。

以下是SSO简单的代码实现
1.首页登录页面index.php(是你当前项目首页)

<?php  
header('Content-Type:text/html; charset=utf-8');  
$sso_address = 'http://www.mysso.com/sso/login.php'; //你SSO所在的域名,不是当前项目地址  
$callback_address = 'http://'.$_SERVER['HTTP_HOST']  
                    .str_replace('index.php','',$_SERVER['SCRIPT_NAME'])  
                    .'callback.php'; //callback地址用于回调设置cookie
if(isset($_COOKIE['sign'])){
    exit("欢迎您{$_COOKIE['sign']} <a href='{$sso_address}?logout=1'>退出</a>");  
}else{  
    echo '您还未登录 <a href="'.$sso_address.'?callback='.$callback_address.'">点此登录</a>';
}  
?> 
<iframe src="<?php echo $sso_address ?>?callback=<?php echo $callback_address ?>" frameborder="0"  width="0" height="0"></iframe>

2.当前项目的中间件用来赋值cookie和清空cookie的文件callback.php

<?php  
header('Content-Type:text/html; charset=utf-8');  
if(empty($_GET)){ 
    exit('您还未登录');  
}else{  
    foreach($_GET as $key=>$val){  
        setcookie($key,$val,0,'');  
    }  
    header("location:index.php");  
}

3.很重要的文件login.php(是sso登录也要放在第三方网站下面)

<?php  
header('Content-Type:text/html; charset=utf-8');  
if(isset($_GET['logout'])){ 
    setcookie('sign','',-300);  
    unset($_GET['logout']);  
    header('location:http://www.zjx.com/sso/callback.php?sign'); //注意替换成你项目的域名
} 

if(isset($_POST['username']) && isset($_POST['password'])){ 
    setcookie('sign',$_POST['username'],0,'');  
    header("location:".$_POST['callback']."?sign={$_POST['username']}");  
} 

if(empty($_COOKIE['sign'])){
?> 

<form method="post">  
<p>用户名:<input type="text" name="username" /></p>  
<p>密  码:<input type="password" name="password" /></p>  
<input type="hidden" name="callback" value="<?php echo $_GET['callback']; ?>" />  
<input type="submit" value="登录" />  
</form> 


<?php  
}else{  
    $query = http_build_query($_COOKIE);  
    echo "系统检测到您已登录 {$_COOKIE['sign']} <a href='{$_GET['callback']}?{$query}''>授权</a> <a href='?logout'>退出</a>";  
}

原理:
根据你第三方登录页面输入的信息,判断是否用户正确信息,然后记录到cookie里面,然后带上加密的sign,跳转回去中间件文件callback.php,然后解密,进行当前项目的cookie进行赋值,然后跳转回首页,并且实现登录了!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值