单点登录

因业务发展,公司有三个网站,需要做单点登录
上网百度了一个demo,自己本地跑了一下,特此记录
首先要有两个域名 a.comb.com
在a.com 下面有一个项目文件夹 test1和test2,以及外部的一个加密算法文件
在这里插入图片描述

test1中 index.php

 <?php
   session_start();
   ?>
   <!DOCTYPE html>
   <html>
   <head>
      <meta charset="UTF-8"/>
      <title>sync login</title>
 </head>
  <body>

  <?php if(empty($_SESSION['username'])):?>
     <p>hello,游客;请先<a href="login.php">登录</a></p>
     <p><a href="http://b.com/index.php">进入空间</a></p>
<?php else: ?>
     <p>hello,<?php echo $_SESSION['username']; ?>;<a href="http://b.com/index.php">进入空间</a></p>
  <?php endif; ?>
 <a href="http://a.com/index.php">home</a>
 </body>
</html>

login.php

<?php
session_start();
if(!empty($_POST['username'])){
 require '../Des.php';
 $_SESSION['username'] = $_POST['username'];
 $redirect = 'http://a.com/index.php';
 header('Location:http://a.com/sync.php?redirect='.urlencode($redirect).'&code='.Des::encode($_POST['username'],'a'));exit;
}
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<title>sync login</title>
</head>
<body>
<form action="" method="post">
 <input type="text" name="username" placeholder="用户名"/>
 <input type="text" name="password" placeholder="密码"/>
 <input type="submit" value="登录"/>
</form>
</body>
</html>

sync.php

<?php
$redirect = empty($_GET['redirect']) ? 'a.com' : $_GET['redirect'];
if(empty($_GET['code'])){
 header('Loaction:http://'.urldecode($redirect));
 exit;
}
$apps = array(
 'b.com/slogin.php'
);
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"/>
<?php foreach($apps as $v): ?>
<script type="text/javascript" src="http://<?php echo $v.'?code='.$_GET['code'] ?>"></script>
<?php endforeach; ?>
<title>passport</title>
</head>
<body>
<script type="text/javascript">
window.onload=function(){
 location.replace('<?php echo $redirect; ?>');
}
</script>
</body>
</html>

这个文件表达的是: a网站登陆成功后,把其他允许的apps下的网站带着加密的code 顺便也登陆一下,然后跨域生成本地session,访问方式是script src 访问

test2 index.php

<?php
session_start();
if(!empty($_SESSION['username']))
{
  echo "欢迎来到".$_SESSION['username']."的空间";
}else{
  echo "请先登录";
}
?>

slogin.php

<?php
session_start();
header('Content-Type:text/javascript; charset=utf-8');
if(!empty($_GET['code'])){
 require '../Des.php';
 $username = Des::decode($_GET['code'],'a');
 if(!empty($username)){
  header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
  $_SESSION['username'] = $username;
 }
}
?>

des.php

<?php

  class Des
 {
        /**
         * 简单对称加密算法之加密
         * @param String $string 需要加密的字串
        * @param String $skey   加密EKY
         * @return String
         */
     public static function encode($string = '', $skey = 'php')
     {
          $strArr   = str_split(base64_encode($string));
          $strCount = count($strArr);
          foreach (str_split($skey) as $key => $value) {
              $key < $strCount && $strArr[$key] .= $value;
          }
         return str_replace(array('=', '+', '/'), array('O0O0O', 'o000o', 'oo00o'), join('', $strArr));
     }

     /**
          * 简单对称加密算法之解密
          * @param String $string 需要解密的字串
          * @param String $skey   解密KEY
          * @return String
          */
     public static function decode($string = '', $skey = 'php')
     {
         $strArr   = str_split(str_replace(array('O0O0O', 'o000o', 'oo00o'), array('=', '+', '/'), $string), 2);
         $strCount = count($strArr);
         foreach (str_split($skey) as $key => $value) {
             $key <= $strCount && isset($strArr[$key]) && $strArr[$key][1] === $value && $strArr[$key] = $strArr[$key][0];
         }
         return base64_decode(join('', $strArr));
     }
 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值