使用背景
1.什么时候需要考虑使用单点登陆?
2.单点登陆对用户数据要求是什么?
1.SSO单点登陆介绍
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
sso主要分为:
1.同域 SSO(多应用同一个域名)
2.同父域SSO (多应用主域名一致)
3.跨域SSO (多应用主域名不一致)
待讨论问题:
1.单点登陆系统 数据一致性问题 多用户中心还是单用户中心
2.单点登陆的实现方案
2.1 使用cookie共享实现单点登陆(同父域SSO)
本地使用a.sso.com和 b.sso.com 分别解析到 对应的目录
每个目录下面三个文件 分别为 login.php index.php logout.php
<?php
//login.php
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : null;
if ($username){
header("location: http://a.sso.com/index.php");
}
if ( !empty($_POST['username']) && !empty($_POST['password']) &&
$_POST['username'] == "test" && $_POST['password'] == "123456" ){
$isLogin = true;
//设置cookie域名为主域名
setcookie("username", 'test', time()+3600, "/", "sso.com");
header("location: http://a.sso.com/index.php");
}
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>A站点</title>
</head>
<body>
<h2>A站点</h2>
<form action="/login.php" method="post" enctype="application/x-www-form-urlencoded" >
<div>
用户名:<input type="text" name="username" value="test">
</div>
<div>
密码:<input type="text" name="password" value="123456">
</div>
<div>
<button>登陆</button>
</div>
</form>
</body>
</html>
//index.php
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : null;
if ($username){
echo "<h2>A站点</h2>";
echo "<h2>".$username."已经登陆<a href='/logout.php'>退出</a></h2>";
}else{
header("location: http://a.sso.com/login.php");
}
//logout.php
setcookie("username", null, time()-1, "/", "sso.com");
header("location: http://a.sso.com/login.php");
b站点下面的代码基本一致 最终可以实现 2两个站点的同步登陆和退出的操作
该方案总结
- .登陆信息直接存cookie里面 不是很安全 可以进行复杂的加密处理 (或者可以使用jwt)
- 如果要使用session存储,通过session共享存数据库或者缓存服务器也可实现。
- 该方案不能实现不同主域名的单点登陆
- 该方案的登陆也可以单独进行部署
2.2 使用P3P协议实现跨域设置cookie(跨域SSO)
P3P是什么
P3P(Platform for Privacy Preferences)是W3C公布的一项隐私保护推荐标准,以为用户提供隐私保护。 P3P标准的构想是:Web 站点的隐私策略应该告之访问者该站点所收集的信息类型、信息将提供给哪些人、信息将被保留多少时间及其使用信息的方式,如站点应做诸如 “本网站将监测您所访问的页面以提高站点的使用率”或“本网站将尽可能为您提供更合适的广告”等申明。访问支持P3P网站的用户有权查看站点隐私报告,然 后决定是否接受cookie 或是否使用该网站。
利用P3P实现跨域
有别于JS跨域、IFRAME跨域等的常用处理办法,通过发送P3P头信息而实现的跨域。
PHP 使用P3P协议
header('P3P: CP="CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR"');
通过以上介绍可以看出 部分浏览器支持跨域的cookie设置 使用p3p可以解决cookie的跨域设置从而实现跨域的单点登陆 目前Ucenter就是采用这种模式。
所以对第一种方法代码进行简单的修改 分别配置 a.sso1.com 和 a.sso2.com对应各自的目录,每个目录下面的文件为 index.php login.php logout.php
a.sso1.com下面的代码如下:
//index.php
<?php
$username = isset($_COOKIE['username']) ? $_COOKIE['username'] : null;
if ($username){
echo "<h2>A站点&