php实现单点登录原理
PHP实现单点登录的原理
单点登录(Single Sign-On, SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于PHP的实现原理和关键步骤:
核心原理
SSO的核心是集中式认证和令牌传递。用户首次登录时,由中央认证服务器(如CAS)验证身份并生成令牌,其他系统通过验证令牌实现免登。
实现步骤
1. 中央认证服务(CAS)搭建
- 部署独立的PHP服务作为认证中心(如
auth.example.com)。 - 用户登录时,CAS生成加密的
Token(如JWT)并存储到数据库或缓存(Redis)。
// 生成Token示例(JWT)
use Firebase\JWT\JWT;
$token = JWT::encode([
'user_id' => 123,
'exp' => time() + 3600 // 过期时间
], 'secret_key');
2. 子系统信任验证
- 子系统(如
app1.example.com)检查本地Session是否存在登录状态。 - 若未登录,重定向到CAS并携带回调地址(
return_url)。
// 检查本地Session
session_start();
if (!isset($_SESSION['user'])) {
header("Location: https://auth.example.com/login?return_url=" . urlencode($_SERVER['REQUEST_URI']));
}
3. Token传递与验证
- CAS验证用户后,将Token作为参数重定向回子系统。
- 子系统通过API请求CAS验证Token有效性。
// 子系统接收Token并验证
$token = $_GET['token'];
$decoded = JWT::decode($token, 'secret_key', ['HS256']);
if ($decoded->exp > time()) {
$_SESSION['user'] = $decoded->user_id;
}
4. 跨域Session共享
- 使用共享数据库存储Session,或通过CAS的API获取用户信息。
- 子系统通过Token向CAS请求用户数据(如REST API)。
// 请求用户数据示例
$user_data = file_get_contents("https://auth.example.com/api/user?token=" . $token);
关键技术点
- 跨域Cookie:需设置
SameSite=None和Secure(HTTPS)。 - Token安全:使用JWT签名或OAuth2.0协议防止篡改。
- Session同步:通过CAS广播或子系统主动轮询实现。
扩展方案
- OAuth2.0:适用于第三方授权(如Google/Facebook登录)。
- SAML:企业级XML协议,适合复杂场景。
通过上述步骤,PHP可实现高效、安全的单点登录系统。实际开发中建议使用成熟框架(如Laravel Passport)简化流程。







