php实现单点登陆
实现单点登录(SSO)的基本原理
单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。PHP实现SSO通常基于共享会话或令牌机制,以下是两种常见实现方式。
基于共享会话的SSO实现
共享会话的核心是将用户登录状态存储在中心服务器,各子系统通过验证中心服务器的会话实现登录。
在中心服务器(auth.example.com)创建登录逻辑:
// 用户登录验证
session_start();
if ($_POST['username'] && $_POST['password']) {
$_SESSION['user'] = $_POST['username'];
setcookie('sso_token', uniqid(), time()+3600, '/', '.example.com');
}
在子系统(app1.example.com)验证登录状态:
session_start();
if (!isset($_SESSION['user'])) {
header("Location: https://auth.example.com/login.php?return_url=".urlencode($_SERVER['REQUEST_URI']));
exit;
}
基于令牌的SSO实现
令牌机制通过加密的令牌传递验证信息,适合跨域场景。

生成令牌(auth.example.com):
function generateToken($user) {
$data = [
'user' => $user,
'exp' => time() + 3600
];
return base64_encode(json_encode($data));
}
验证令牌(子系统):
function verifyToken($token) {
$data = json_decode(base64_decode($token), true);
if ($data && $data['exp'] > time()) {
return $data['user'];
}
return false;
}
跨域会话共享的Cookie设置
要实现跨域会话共享,需要设置顶级域Cookie:

setcookie('sso_token', $token, time()+3600, '/', '.example.com');
各子系统通过检查该Cookie判断登录状态:
if (isset($_COOKIE['sso_token'])) {
$user = verifyToken($_COOKIE['sso_token']);
if ($user) {
$_SESSION['user'] = $user;
}
}
安全注意事项
实现SSO时需考虑以下安全措施:
- 使用HTTPS保证传输安全
- 令牌设置合理的过期时间
- 对敏感操作进行二次验证
- 记录登录日志用于审计
使用现有SSO解决方案
对于生产环境,推荐使用成熟的SSO协议:
- SAML 2.0
- OAuth 2.0
- OpenID Connect
这些协议有完善的PHP库支持,如:
- SimpleSAMLphp(SAML实现)
- league/oauth2-client(OAuth客户端)
- php-openid-connect(OpenID实现)






