php单点登录SSO(Single Sign On)的解决思路
一、什么是单点登录
解释:登录一个系统后,其它系统无需再次登录,即可进入。
二、举个例子:
你登录了淘宝,然后你进入天猫,发现你不用登录了。这时你要注意到,淘宝跟天猫可是完全不一样的域名。
你登录淘宝后,你的浏览器得到了cookie,但是这个cookie是在淘宝域名下的。你的天猫域名下并没有cookie。
这个时候你要想办法让天猫域名下也有这个相同的cookie。假设你的天猫域名下也有这个cookie。
当你的浏览器进入天猫时,你的浏览器会携带天猫域名下的cookie去服务器验证。
但是这个cookie对应的可是淘宝域名下的session数据,这个时候又该如何呢。
从这个例子中引出两个问题:
1、跨域种cookie
2、服务端保持cookie对应的session数据是一样的
三、解决思路

四、示例代码
A域名下的 index.php 文件
<?php
header("Content-type: text/html; charset=utf-8"); if(!empty($_POST)) {
$response = curl_post('http://www.U.com/index.php',$_POST);
if($response['code'] > 0) {
die('error:'.$response['msg']);
} set_cookie('SID',$response['data']['sid'],0,'/','',0,1);
echo '登录成功';
$url = 'http://www.B.com/setcookie.php?sid='.$response['data']['sid'];
die('<script type="text/javascript" src="'.$url.'" reload="1"></script>'); } function curl_post( $url , $arrPost = array() , $func = "http_build_query" ){
$ch = curl_init(); $opt[CURLOPT_URL] = $url;
$opt[CURLOPT_RETURNTRANSFER] = 1;
$opt[CURLOPT_TIMEOUT] = 10;
if( !empty( $arrPost ) ){
if( $func == 'json_encode' )
$opt[CURLOPT_HTTPHEADER] = array("Content-Type: application/json;charset=UTF-8");
$opt[CURLOPT_POST] = 1;
$opt[CURLOPT_POSTFIELDS] = call_user_func( $func , $arrPost );
} curl_setopt_array ( $ch, $opt );
$response = curl_exec( $ch );
curl_close( $ch ); return json_decode($response, true);
}
/**
* 免刷新写入cookie
* name 必需。规定 cookie 的名称。
* value 必需。规定 cookie 的值。
* expire 必需。规定 cookie 的有效期。
* path 可选。规定 cookie 的服务器路径。
* domain 可选。规定 cookie 的域名。
* secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
* httponly 可选。规定是否禁止js读取cookie。
*/
function set_cookie($name,$value='',$expire=0,$path='/',$domain='',$secure=0,$httponly=0) {
$_COOKIE[$name] = $value;
if(is_array($value)){
foreach($value as $k=>$v){
if(is_array($v)){
foreach($v as $a=>$b){
setcookie($name.'['.$k.']['.$a.']',$b,$expire,$path,$domain,$secure,$httponly);
}
}else{
setcookie($name.'['.$k.']',$v,$expire,$path,$domain,$secure,$httponly);
}
}
}else{
setcookie($name,$value,$expire,$path,$domain,$secure,$httponly);
}
}
?>
<!DOCTYPE HTML>
<html>
<head>
<title>A域名的登录框</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<form action="http://www.A.com/index.php" method="post">
<input type="text" name="uname" placeholder="帐号"/>
<input type="password" name="upasswd" placeholder="密码"/>
<input type="submit" value="提交" />
</form>
</body>
</html>
B域名下的 index.php 文件
<?php
header("Content-type: text/html; charset=utf-8");
$sid = isset($_COOKIE['SID']) ? $_COOKIE['SID'] : ''; if(empty($sid)) echo "请先登录"; $response = curl_post('http://www.U.com/index.php',array('sid'=>$sid));
if($response['code'] > 0) {
die('error:'.$response['msg']);
} die('您的帐号密码是:'.$response['data']['uinfo']); function curl_post( $url , $arrPost = array() , $func = "http_build_query" ){
$ch = curl_init(); $opt[CURLOPT_URL] = $url;
$opt[CURLOPT_RETURNTRANSFER] = 1;
$opt[CURLOPT_TIMEOUT] = 10;
if( !empty( $arrPost ) ){
if( $func == 'json_encode' )
$opt[CURLOPT_HTTPHEADER] = array("Content-Type: application/json;charset=UTF-8");
$opt[CURLOPT_POST] = 1;
$opt[CURLOPT_POSTFIELDS] = call_user_func( $func , $arrPost );
} curl_setopt_array ( $ch, $opt );
$response = curl_exec( $ch );
curl_close( $ch ); return json_decode($response, true);
}
B域名下的 setcookie.php 文件
<?php
header("Content-type: text/html; charset=utf-8");
$sid = isset($_GET['sid']) ? $_GET['sid'] : ''; if(!empty($sid)) {
set_cookie('SID',$sid,0,'/','',0,1);
} /**
* 免刷新写入cookie
* name 必需。规定 cookie 的名称。
* value 必需。规定 cookie 的值。
* expire 必需。规定 cookie 的有效期。
* path 可选。规定 cookie 的服务器路径。
* domain 可选。规定 cookie 的域名。
* secure 可选。规定是否通过安全的 HTTPS 连接来传输 cookie。
* httponly 可选。规定是否禁止js读取cookie。
*/
function set_cookie($name,$value='',$expire=0,$path='/',$domain='',$secure=0,$httponly=0) {
$_COOKIE[$name] = $value;
if(is_array($value)){
foreach($value as $k=>$v){
if(is_array($v)){
foreach($v as $a=>$b){
setcookie($name.'['.$k.']['.$a.']',$b,$expire,$path,$domain,$secure,$httponly);
}
}else{
setcookie($name.'['.$k.']',$v,$expire,$path,$domain,$secure,$httponly);
}
}
}else{
setcookie($name,$value,$expire,$path,$domain,$secure,$httponly);
}
}
U域名下的 index.php 文件
<?php
header("Content-type: text/html; charset=utf-8"); $sid = isset($_POST['sid']) ? $_POST['sid'] : '';
if(!empty($sid)) {
$uname_upasswd = file_get_contents($sid);
if(empty($uname_upasswd)) {
die(json_encode(array(
'code'=>1,
'msg'=>'fail',
'data'=>array()
)));
}
die(json_encode(array(
'code'=>0,
'msg'=>'success',
'data'=>array('uinfo'=>$uname_upasswd)
)));
} $uname = isset($_POST['uname']) ? $_POST['uname'] : '';
$upasswd = isset($_POST['upasswd']) ? $_POST['upasswd'] : '';
if($uname == '' || $upasswd == '') {
die(json_encode(array(
'code'=>1,
'msg'=>'fail',
'data'=>array()
)));
} define('SID_SALT', '密码盐'); $passwd = passwd($uname.$upasswd,SID_SALT);
file_put_contents($passwd, $uname.','.$upasswd); die(json_encode(array(
'code'=>0,
'msg'=>'success',
'data'=>array('sid'=>$passwd)
))); function passwd($string,$salt) {
return md5(substr(md5($string).md5($salt),16,48));
}
验证流程:
1、进入A域名,输入帐号密码点击登录。
2、进入B域名,此时会打印出你在A域名输入的帐号密码。
注意:这只是一个简单的验证,实际开发中需要做cookie加密,实效验证等。而且,其实单点登录问题,还有其他解决思路。
php单点登录SSO(Single Sign On)的解决思路的更多相关文章
- java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)
1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package ...
- 单点登录(Single Sign On)解决方案
单点登录(Single Sign On)解决方案 需求 多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统. A 网站和 B 网站是同一家公司的关联服务.现在要求,用户只要在其中一个网 ...
- 自己动手搭建 CAS(Central Authentication Service) 环境,为了单点登录(Single Sign On , 简称 SSO )
介绍 刚刚搭建 CAS 成功了,现在记录下来,怕以后忘记,同时也给需要帮助的人.CAS 搭建需要服务端和客户端,服务端是 Java 写的,如果自己搭建则需要安装与配置 Java 环境.客户端可以是多种 ...
- .NET基于Redis缓存实现单点登录SSO的解决方案[转]
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
- 单点登录SSO
转载自 http://www.blogjava.net/xcp/archive/2010/04/13/318125.html 摘要:单点登录(SSO)的技术被越来越广泛地运用到各个领域的软件系统当 ...
- .NET基于Redis缓存实现单点登录SSO的解决方案
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
- 十六、【适合中小企业的.Net轻量级开源框架】EnterpriseFrameWork框架核心类库之单点登录SSO
回<[开源]EnterpriseFrameWork框架系列文章索引> EFW框架源代码下载:http://pan.baidu.com/s/1qWJjo3U 单点登录(Single Sign ...
- Redis缓存实现单点登录SSO
.NET基于Redis缓存实现单点登录SSO的解决方案 .NET基于Redis缓存实现单点登录SSO的解决方案 一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单 ...
- 《浅谈架构之路:单点登录 SSO》
前言:SSO 单点登录 “半吊子”的全栈工程师又来了,技术类的文章才发表了两篇,本来想先将主攻的几个系列都开个头(Nodejs.Java.前端.架构.全栈等等),无奈博客起步太晚,写博文的时间又没有很 ...
随机推荐
- 使用springboot实现一个简单的restful crud——03、前端页面、管理员登陆(注销)功能
前言 这一篇我们就先引入前端页面和相关的静态资源,再做一下管理员的登陆和注销的功能,为后续在页面上操作数据做一个基础. 前端页面 前端的页面是我从网上找的一个基于Bootstrap 的dashboar ...
- python取字母以及数字随机数
一.这里用到了:String模块ascii_letters和digits ''.join(random.sample(string.ascii_letters + string.digits, 9)) ...
- vue应用难点总结
一.父子组件生命周期 父组件create->子组件create->子组件mounted->父组件mounted 当一个钩子函数使用了异步请求时,并不会等该钩子函数中所有异步的回调都执 ...
- Solr-rce历史漏洞复现
最近Solr又出了一个RCE漏洞,复现了一下 # coding: utf-8 import requestsimport argparsefrom urllib import parse if __n ...
- 使用gulp构建项目
gulp.js作为一个前端构建工具,类似于webpack.Grountjs.rollupjs,不过相对于其他几种打包工具,gulp的使用更轻量,配置更简单,打包速度更快,今天不说他们几个的区别,也不说 ...
- 编译安装php服务报错问题:configure: error: Cannot find libmysqlclient under /usr.
在编译安装php服务时报错: checking for MSSQL support via FreeTDS... nochecking for MySQL support... yeschecking ...
- [极客-Linux] 05 系统调用
分配内存的系统调用 1)brk 小内存 2)mmap 大内存 sigaction 注册信号处理函数 进程间通信: 1)消息队列,在内核中,msgget 创建 2)共享内存,shmget 内核源代码 ...
- Linux实验:ssh免密码配置
[实验目的] 1)了解ssh工具的作用 2)熟悉ssh配置过程 3)理解ssh原理[实验原理] SSH是目前比较可靠的专为远程登录会话和其他网络服务提供安全的协议.不同主机之间 ...
- CDH构建大数据平台-使用自建的镜像地址安装Cloudera Manager
CDH构建大数据平台-使用自建的镜像地址安装Cloudera Manager 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.搭建CM私有仓库 详情请参考我的笔记: http ...
- 用js刷剑指offer(丑数)
题目描述 把只包含质因子2.3和5的数称作丑数(Ugly Number).例如6.8都是丑数,但14不是,因为它包含质因子7. 习惯上我们把1当做是第一个丑数.求按从小到大的顺序的第N个丑数. 思路 ...