PHP SSO详解
SSO有三种模式:①跨子域单点登陆②完全跨单点域登陆③站群共享身份认证
第一种模式很简单,只需要将Cookie的域设置成多个应用的根域即可
第二种方式,也很简单,就是将所以应用的认证地址更换成同一个认证地址,每次查看是否在认证中心登陆,如果登陆了,给调用应用发放一个加密令牌即可
第三种跨域,就是来回跳转来回验证token略有麻烦
配置目录结构
在服务器根目录下,新建三个项目目录:
|–/网站根目录/
|–|–/oa/
|–|–/bbs/
|–|–/blog/
在根目录下新建functions.PHP脚本文件,具体内容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
<?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' , $_password , time()+3600, '/' , $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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
<?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文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<?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' , $username , time()+3600, '/' , 'taoip.cn' );
setcookie( 'token' , $_password , time()+3600, '/' , 'taoip.cn' );
// 如果URL没有值重定向到首页,否则重定向到URL页面
if ( empty ( $url )) {
header( 'location: index.php' );
} else {
header( 'location: ' . $lurl );
}
}
}
?>
<!DOCTYPE html>
<html lang= "en" >
<head>
<meta charset= "UTF-8" >
<meta name= "generator" content= "Sublime Text 3114" >
<meta name= "author" content= "3@dengpeng.cc" >
<meta name= "keywords" content= "" >
<meta name= "description" content= "" >
<title>OA站点登陆系统</title>
</head>
<body>
<div class = "container" >
<h2>oa.taoip.cn站点登陆系统</h2>
<form action= "" method= "post" >
<label for = "" >用户名</label>
<input type= "text" name= "username" >
<br>
<label for = "" >密码</label>
<input type= "text" name= "password" >
<hr>
<button type= "submit" >提交</button>
</form>
</div>
</body>
</html>
|
在bbs项目目录下,新建index.php和login.php两个脚本文件
编辑index.php文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
<?php
/**
* @author DengPeng <3@dengpeng.cc>
* @since 2017/01/03
* @copyright copyright (c) 2017 zixue.it GPL
* @license http://www.zixue.it/
*/
// BBS站点
// (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}用户,访问BBS站点" ;
?>
|
编辑login.php文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
<?php
/**
* @author DengPeng <3@dengpeng.cc>
* @since 2017/01/03
* @copyright copyright (c) 2017 zixue.it GPL
* @license http://www.zixue.it/
*/
// BBS站点登陆系统
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://bbs.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' , $username , time()+3600, '/' , 'taoip.cn' );
setcookie( 'token' , $_password , time()+3600, '/' , 'taoip.cn' );
// 如果URL没有值重定向到首页,否则重定向到URL页面
if ( empty ( $url )) {
header( 'location: index.php' );
} else {
header( 'location: ' . $lurl );
}
}
}
?>
<!DOCTYPE html>
<html lang= "en" >
<head>
<meta charset= "UTF-8" >
<meta name= "generator" content= "Sublime Text 3114" >
<meta name= "author" content= "3@dengpeng.cc" >
<meta name= "keywords" content= "" >
<meta name= "description" content= "" >
<title>BBS站点登陆系统</title>
</head>
<body>
<div class = "container" >
<h2>bbs.taoip.cn站点登陆系统</h2>
<form action= "" method= "post" >
<label for = "" >用户名</label>
<input type= "text" name= "username" >
<br>
<label for = "" >密码</label>
<input type= "text" name= "password" >
<hr>
<button type= "submit" >提交</button>
</form>
</div>
</body>
</html>
|
在blog项目目录下,新建index.php和login.php两个脚本文件
编辑index.php文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
<?php
/**
* @author DengPeng <3@dengpeng.cc>
* @since 2017/01/03
* @copyright copyright (c) 2017 zixue.it GPL
* @license http://www.zixue.it/
*/
// blog站点
// (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}用户,访问blog站点" ;
?>
<?php
/**
* @author DengPeng <3@dengpeng.cc>
* @since 2017/01/03
* @copyright copyright (c) 2017 zixue.it GPL
* @license http://www.zixue.it/
*/
// blog站点
// (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}用户,访问blog站点" ;
?>
|
编辑login.php文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
<?php
/**
* @author DengPeng <3@dengpeng.cc>
* @since 2017/01/03
* @copyright copyright (c) 2017 zixue.it GPL
* @license http://www.zixue.it/
*/
// blog站点登陆系统
require '../functions.php' ;
// (2)验证
yzToken( 'dengpeng.cc' );
// (1)判断是否登陆,登陆则跳转首页,未登录则去其他站点获取token
$url = isset( $_GET [ 'url' ]) ? $_GET [ 'url' ] : '' ;
if ( empty ( $url )) {
getToken( 'http://oa.taoip.cn/login.php?url=http://dengpeng.cc/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 );
}
}
// (3)判断用户是否提交数据
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 ) {
setCook( $username , $_password , 'dengpeng.cc' );
if ( empty ( $url )) {
header( 'location: index.php' );
} else {
header( 'location: ' . $lurl );
}
}
}
?>
<!DOCTYPE html>
<html lang= "en" >
<head>
<meta charset= "UTF-8" >
<meta name= "generator" content= "Sublime Text 3114" >
<meta name= "author" content= "3@dengpeng.cc" >
<meta name= "keywords" content= "" >
<meta name= "description" content= "" >
<title>blog站点登陆系统</title>
</head>
<body>
<div class = "container" >
<h2>dengpeng.cc站点登陆系统</h2>
<form action= "" method= "post" >
<label for = "" >用户名</label>
<input type= "text" name= "username" >
<br>
<label for = "" >密码</label>
<input type= "text" name= "password" >
<hr>
<button type= "submit" >提交</button>
</form>
</div>
</body>
</html>
|
配置本地虚拟主机
具体配置步骤,我想大家应该都会了,不需要我一一赘述.你只需要按照我给的参照,配置和不同域名对应目录的映射即可.
域名 /项目目录/
oa.taoip.cn /oa/
bbs.taoip.cn /bbs/
dengpeng.cc /blog/
恭喜您,已经完成了一个简单的SSO系统
配置完成后,记得重启Web服务器.然后你只需要访问这三个不同的站点,即可实现一个站点登陆,其他站点不再发送登陆请求.
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!