php实现单点登录原理
PHP实现单点登录原理
单点登录(Single Sign-On, SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于PHP的实现原理和关键步骤:
核心原理
-
集中式认证中心
所有系统的登录请求重定向到统一的认证中心(如独立的SSO服务器),由该中心验证用户身份并颁发令牌。 -
令牌传递机制
用户首次登录成功后,认证中心生成加密令牌(如JWT或Session ID),通过URL参数、Cookie或跨域存储(如localStorage)传递给其他子系统。
-
跨域信任关系
子系统需信任认证中心颁发的令牌,通过共享密钥或公钥验证令牌有效性,避免重复认证。
实现步骤
1. 认证中心设计

- 创建独立的SSO服务器(如
sso.example.com),处理登录请求并生成令牌。 - 使用PHP的
session_start()管理用户会话,或生成JWT令牌:// 生成JWT示例(需安装firebase/php-jwt库) use \Firebase\JWT\JWT; $token = JWT::encode(['user_id' => 123, 'exp' => time() + 3600], 'secret_key');
2. 子系统集成
- 子系统检查本地会话是否存在,若不存在则跳转至SSO服务器:
if (!isset($_SESSION['user'])) { header("Location: https://sso.example.com/login?return_url=" . urlencode($_SERVER['REQUEST_URI'])); exit; }
3. 令牌验证
- SSO服务器回调子系统时携带令牌,子系统需验证:
$token = $_GET['token']; try { $decoded = JWT::decode($token, 'secret_key', ['HS256']); $_SESSION['user'] = $decoded->user_id; } catch (Exception $e) { die("Token验证失败"); }
4. 跨域会话共享
- 若子系统与SSO服务器同域,可直接共享Cookie。跨域时需通过:
- 父域Cookie:设置Cookie域名为
.example.com。 - 前端中转:通过隐藏的iframe或JavaScript传递令牌。
- 父域Cookie:设置Cookie域名为
安全注意事项
- HTTPS必需:所有通信需加密,防止令牌泄露。
- 令牌时效性:设置短期有效的令牌(如JWT的
exp字段)。 - 防CSRF:对关键操作添加CSRF Token验证。
扩展方案
- OAuth2.0/OpenID Connect:直接使用成熟协议(如Laravel Passport)简化开发。
- SAML:适用于企业级SSO,但实现复杂度较高。
通过上述方法,PHP可实现高效安全的单点登录系统,适用于多应用统一管理的场景。






