php单点登录实现
PHP 单点登录实现方案
单点登录(SSO)允许用户通过一次登录访问多个关联系统。以下是几种常见的PHP实现方法:
基于共享Session的方案
在同一个主域名下的子域之间共享Session,需在php.ini中配置:
session.cookie_domain = .example.com
代码示例:
// 设置跨子域的Session
ini_set('session.cookie_domain', '.example.com');
session_start();
$_SESSION['user'] = $userInfo;
基于Token的方案
-
认证中心生成Token:
$token = bin2hex(random_bytes(32)); $_SESSION['sso_token'] = $token; setcookie('sso_token', $token, 0, '/', '.example.com'); -
子系统验证Token:
if (isset($_COOKIE['sso_token']) && $_COOKIE['sso_token'] === $_SESSION['sso_token']) { // 已登录 }
基于OAuth2的实现
使用league/oauth2-client库:
require 'vendor/autoload.php';
$provider = new \League\OAuth2\Client\Provider\GenericProvider([
'clientId' => 'your_client_id',
'clientSecret' => 'your_client_secret',
'redirectUri' => 'https://your-app.com/callback',
'urlAuthorize' => 'https://sso-server.com/oauth/authorize',
'urlAccessToken' => 'https://sso-server.com/oauth/token',
'urlResourceOwnerDetails' => 'https://sso-server.com/oauth/userinfo'
]);
跨域解决方案
对于完全不同的域名,可以使用:
- 中央认证页面跳转
- 隐藏iframe通信
- 使用postMessage API
示例postMessage实现:

// 子系统接收消息
window.addEventListener('message', function(event) {
if (event.origin === 'https://sso-server.com') {
localStorage.setItem('sso_token', event.data.token);
}
});
安全注意事项
- 所有Token必须设置有效期
- 使用HTTPS传输敏感数据
- 实现CSRF防护机制
- 定期轮换加密密钥
完整流程示例
- 用户访问app1.example.com
- 系统检查本地Session,若无则重定向到sso.example.com
- 认证中心验证用户身份后生成Token
- 重定向回原系统并附带Token参数
- 原系统向认证中心验证Token有效性
- 建立本地Session并完成登录
可以根据具体需求选择适合的方案组合实现。






