php网站单点登录--卷二(代理登录)
admin
2023-06-28 14:24:16
0次

   上一篇文章简单实现了子域名的session共享方式的单点登录,这篇文章用代理的方式实现不同域名下的单点同步登录,想要实现多域名登录就需要让用户的浏览器记录每个域名的cookie,那么必须要让浏览器请求一次这些主机,方法很简单在页面中加入其他域名的链接如

一些浏览器默认不接受第三方的cookie写入,必须添加P3P HTTP header 来尝试;


知识点:

    1.src属性不受域名的限制。

    2.P3P 突破跨域。


实验域名:

   主域名:www.shenxn.com;其他域名:www.wangjun.com;www.xn.com


实验代码:


index.php

//程序主页面

session_start();

?>

sync login

hello,游客;请先登录

hello,


login.php

//登录并且调整到代理页面

session_start();

if(!empty($_POST['username'])){

  require __DIR__.'/Des.php';

  $_SESSION['username'] = $_POST['username'];

  $redirect = 'http://www.shenxn.com/index.php';

  header('Location:http://www.shenxn.com/sync.php?redirect='.urlencode($redirect).'&code='.Des::encrypt($_POST['username'],'openpoor'));

  exit;

}

?>

sync login

 

 

 


sync.php

//通知其他域名主机登录

$redirect = empty($_GET['redirect']) ? 'www.shenxn.com' : $_GET['redirect'];

if(empty($_GET['code'])){  

  header('Loaction:http://'.urldecode($redirect));

  exit;

}

$apps = array(

  'www.xn.com/slogin.php',

  'www.wangjun.com/slogin.php',

);

?>


pass port



slogin.php

//p3p生成cookie 并登录

session_start();

header('Content-Type:text/javascript; charset=utf-8');

if(!empty($_GET['code'])){

  require __DIR__.'/Des.php';

  $username = Des::decrypt($_GET['code'],'openpoor');

  var_dump($_GET['code']);

  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   

class Des{

 

  public static function encrypt($data,$key){

      $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');

      $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));

      srand();

      $iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($module), MCRYPT_RAND);

      mcrypt_generic_init($module,$key,$iv);

      $encrypted=$iv.mcrypt_generic($module,$data);

      mcrypt_generic_deinit($module);

      mcrypt_module_close($module);

      return md5($data).'_'.base64_encode($encrypted);

  }

   

  public static function decrypt($data,$key){    

      $_data = explode('_',$data,2);

      if(count($_data)<2){

    return false;

      }

      $data = base64_decode($_data[1]);      

      $module=mcrypt_module_open('des','', MCRYPT_MODE_CBC,'');

      $key=substr(md5($key),0,mcrypt_enc_get_key_size($module));

      $ivSize=mcrypt_enc_get_iv_size($module);

      $iv=substr($data,0,$ivSize);

      mcrypt_generic_init($module,$key,$iv);

      $decrypted=mdecrypt_generic($module,substr($data,$ivSize,strlen($data)));

      mcrypt_generic_deinit($module);

      mcrypt_module_close($module);

      $decrypted = rtrim($decrypted,"\0");       

      if($_data[0]!=md5($decrypted)){

    return false;

      }

      return $decrypted;

  }

}


相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...