php 单点登录实现
PHP 单点登录实现方案
单点登录(SSO)允许用户通过一次登录访问多个系统。以下是基于PHP的常见实现方法:
基于Token的SSO实现
-
生成Token 用户登录后生成唯一Token并存储到数据库或缓存中:
$token = bin2hex(random_bytes(32)); $_SESSION['sso_token'] = $token; // 存储到数据库 $db->query("INSERT INTO sso_tokens (token, user_id, expires_at) VALUES (?, ?, ?)", [ $token, $user_id, date('Y-m-d H:i:s', time() + 3600) // 1小时过期 ]); -
验证Token 子系统通过API验证Token有效性:
$token = $_GET['token']; $result = $db->query("SELECT user_id FROM sso_tokens WHERE token = ? AND expires_at > NOW()", [$token]); if ($result->rowCount() > 0) { $user_id = $result->fetch()['user_id']; // 登录成功处理 }
基于OAuth2的实现
-
授权服务器配置 使用league/oauth2-server库:

$server = new \League\OAuth2\Server\AuthorizationServer( $clientRepository, $accessTokenRepository, $scopeRepository, $privateKey, $encryptionKey ); -
获取授权码
$authRequest = $server->validateAuthorizationRequest($request); $authRequest->setUser($userEntity); $authRequest->setAuthorizationApproved(true); return $server->completeAuthorizationRequest($authRequest, $response); -
子系统验证
$token = $_GET['access_token']; $response = file_get_contents("https://sso-server/verify?token=".$token); $data = json_decode($response, true); if ($data['valid']) { $_SESSION['user'] = $data['user']; }
基于JWT的实现
-
生成JWT Token 使用firebase/php-jwt库:

use Firebase\JWT\JWT; $payload = [ 'iss' => 'sso-server', 'sub' => $user_id, 'exp' => time() + 3600 ]; $jwt = JWT::encode($payload, $secretKey); -
验证JWT
try { $decoded = JWT::decode($jwt, $secretKey, ['HS256']); $user_id = $decoded->sub; } catch (Exception $e) { // 验证失败处理 }
跨域会话共享方案
-
主域名Cookie设置
setcookie( 'sso_session', $session_id, time() + 3600, '/', '.example.com', // 主域名 true, true ); -
子系统验证 通过iframe或API与主站通信:
// 客户端检查 window.addEventListener('message', function(e) { if (e.origin === 'https://sso.example.com') { if (e.data.loggedIn) { // 已登录处理 } } });
安全注意事项
- 所有Token应设置合理过期时间
- 使用HTTPS传输敏感数据
- 实现CSRF防护机制
- 定期清理过期Token
- 对敏感操作要求重新认证
以上方案可根据实际需求组合使用,大型系统建议采用OAuth2或SAML标准协议。






