代码拉取完成,页面将自动刷新
同步操作将从 TuanZF/SSO 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
<?php
/*
实现简单sso单点登录,具体流程如下
1.用户访问A系统,A系统是需要登录的,但用户现在没有登录。
2.跳转到C系统,即SSO登录系统。 SSO系统也没有登录,弹出用户登录页。
3.用户填写用户名、密码,SSO系统进行认证后,将登录状态写入SSO的session,浏览器(Browser)中写入SSO域下的Cookie。
4.SSO系统登录完成后会生成一个ST(Service Ticket)既Token,登录凭证等意思,然后跳转到app系统,同时将ST作为参数传递给app系统。
5.A系统拿到ST后,从后台向SSO发送请求,验证ST是否有效。
6.验证通过后,A系统记录用户登录状态。
至此,跨域单点登录就完成了。以后我们再访问A系统时,A就是登录的。接下来,我们再看看访问B系统时的流程。
1.用户访问B系统,B系统没有登录,跳转到SSO。
2.由于SSO已经登录了,不需要重新登录认证。
3.SSO生成ST,浏览器跳转到B系统,并将ST作为参数传递给B系统。
4.B系统拿到ST,后台访问SSO,验证ST是否有效。
5.验证成功后,B系统记录用户登录状态。
*/
if (!function_exists('adCurl')) {
/**
* 生成CURL请求
* @param type $url 请求地址
* @param type $data 若为POST,请提交本变量
* @return type 返回获取后的结果
*/
function adCurl($url, $data = [], $curlOption = [])
{
$curl = curl_init(); // 启动一个CURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
if (!empty($data)) {
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, is_array($data) ? http_build_query($data) : $data); // Post提交的数据包
}
curl_setopt($curl, CURLOPT_HEADER, 0); // 显示返回的Header区域内容
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在
if (!empty($curlOption)) {
foreach ($curlOption as $option => $value) {
curl_setopt($curl, $option, $value);
}
}
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转
curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
curl_setopt($curl, CURLOPT_COOKIEJAR, 'test.txt'); //保存
curl_setopt($curl, CURLOPT_COOKIEFILE, 'test.txt'); //读取
$return = curl_exec($curl); // 执行操作
curl_close($curl); // 关闭CURL会话
return json_decode($return);
}
}
/**
* 示例A网站
*/
class ClassA
{
/**
* SSO 系统路由
* @var string
*/
protected $url = "http://c.cn/?a=oauth";
/**
* 用户登录凭证
* @var string
*/
protected $userToken;
/**
* 用户昵称
* @var string
*/
protected $username;
/**
* 构造 获取存在的token
*/
public function __construct()
{
$this->getCookieToken();
}
/**
* 获取用户现在登录状态
* @return bool true|false
*/
public function userLogin()
{
$this->checkRoute();
if(empty($this->userToken))
return false;
return $this->checkSSOToken();
}
/**
* 检测路由
* @return [type] [description]
*/
protected function checkRoute()
{
if(isset($_REQUEST['token'])) {
setcookie('USERTOKEN', $_REQUEST['token'], time() + 3600);
echo "<script>window.location.href='http://a.cn';</script>";
exit;
}
}
/**
* 验证SSO 登录凭证token
* @return [type] [description]
*/
protected function checkSSOToken()
{
$goUrl = $this->url . '&c=' . $this->userToken;
$result = adCurl($goUrl);
if($result->errno == '200') {
$this->userToken = $result->data->token;
$this->username = $result->data->username;
return true;
}
return false;
}
/**
* 获取浏览器登录凭证,暂存cookie,以后可存redis/本地localStorage等
*/
protected function getCookieToken()
{
$this->userToken = isset($_COOKIE['USERTOKEN']) ? $_COOKIE['USERTOKEN'] : '';
}
public function __get($propertyName)
{
return $this->$propertyName;
}
}
$classA = new ClassA();
if( $classA->userLogin() ) {
echo $classA->username.'已登录!';
exit;
} else {
echo '<button type="button"><a href="http://c.cn/?a=login">去登录</a></button>';
exit;
}
?>
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。