PHP编程 SSO详细介绍及简单实例

开发技术 作者: 2024-08-16 19:10:01
这篇文章主要介绍了PHP编程 SSO详细介绍及简单实例的相关资料,这里介绍了三种模式跨子域单点登陆、完全跨单点域登陆、站群共享身份认证,需要的朋友可以参考下

PHP SSO详解

第一种模式很简单,只需要将Cookie的域设置成多个应用的根域即可

第二种方式,也很简单,就是将所以应用的认证地址更换成同一个认证地址,每次查看是否在认证中心登陆,如果登陆了,给调用应用发放一个加密令牌即可

第三种跨域,就是来回跳转来回验证token略有麻烦

配置目录结构

在服务器根目录下,新建三个项目目录:

|–/网站根目录/ |–|–/oa/ |–|–/bbs/ |–|–/blog/

在根目录下新建functions.PHP脚本文件,具体内容如下:

/**

  • 获取登陆token
  • @param string $url 获取token的地址
  • 2017-01-03T13:08:43+0800
    */
    function getToken($url)
    {
    $bool = isLogin();
    if ($bool) {
    // 如果登陆了跳转到本站首页
    header('location: index.php');
    exit();
    }

// 否则没有登陆,去另一个站点看是否登陆
header('location: '.$url);
}

// 校验令牌是否正确
function yzToken($domain)
{
$url = isset($_GET['url']) ? $_GET['url'] : '';
$username = isset($_GET['username']) ? $_GET['username'] : '';
$token = isset($_GET['token']) ? $_GET['token'] : '';

if (!empty($username) && !empty($token)) {
$salt = 'taoip';
$_token = md5($salt.$username);
// 校验第三方站点过来时的token是否正确
if ($_token == $token) {
// 设置跳转过来的网站的Cookie
setCook($username,$_token,$domain);
header('location: index.php');
}
}

}

// 设置cookie
function setCook($username,$_password,$domain)
{
// 校验成功,开始登陆
setcookie('username',$username,time()+3600,'/',$domain);
setcookie('token',$domain);
header('location: index.php');
}

// 判断是否登陆
function isLogin()
{
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';
$salt = 'taoip';

$_token = md5($salt.$username);

if ($token == $_token) {
return true;
} else {
return false;
}
}

?>

在oa项目目录下,新建index.PHP和login.PHP两个脚本文件

编辑index.PHP文件

// OA站点

// (1)开启Session会话
session_name('taoip');
session_start();
// (2)获取用户名和token进行校验
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';

$salt = 'taoip';

$_token = md5($salt.$username);

if ($token != $_token) {
header('location: login.php');
exit();
}

echo "欢迎{$username}用户,访问OA站点";

?>

编辑login.PHP文件

// OA站点登陆系统
require '../functions.php';

// (2)验证
yzToken('taoip.cn');

// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset($_GET['url']) ? $_GET['url'] : '';
if (empty($url)) {
getToken('http://dengpeng.cc/login.php?url=http://oa.taoip.cn/login.php');
}

// (1)判断用户是否登陆
$bool = isLogin();
$url = isset($_GET['url']) ? $_GET['url'] : '';
if ($bool) {
if (empty($url)) {
header('location: index.php');
} else {
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : '';
$token = isset($_COOKIE['token']) ? $_COOKIE['token'] : '';
$lurl = $url.'?username='.$username.'&token='.$token;
header('location: '.$lurl);
}
}

if (!empty($_POST)) {
$username = isset($_POST['username']) ? $_POST['username'] : '';
$password = isset($_POST['password']) ? $_POST['password'] : '';

// 从库中查询用户密码
@$link = mysql_connect('localhost','root','');
mysql_query('use sso',$link);
mysql_query('set names utf8',$link);
$sql = "select * from users where username = '".$username."'";
$user = mysql_fetch_assoc(mysql_query($sql,$link));

// 校验
$salt = 'taoip';
$_password = md5($salt.$username);

// var_dump($user['password'] == $_password);
// print_r($user);exit();

if ($user['password'] == $_password) {
// 校验成功,开始登陆
setcookie('username','taoip.cn');
setcookie('token','taoip.cn');
// 如果URL没有值重定向到首页,否则重定向到URL页面
if (empty($url)) {
header('location: index.php');
} else {
header('location: '.$lurl);
}
}
}

?>

@H_404_37@
<html lang="en">

OA站点登陆系统
原创声明
本站部分文章基于互联网的整理,我们会把真正“有用/优质”的文章整理提供给各位开发者。本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

本文链接:http://www.jiecseo.com/news/show_63370.html