php实现sso
PHP 实现 SSO(单点登录)
SSO(Single Sign-On)允许用户通过一次登录访问多个系统。以下是使用 PHP 实现 SSO 的常见方法:
基于 Session 共享的 SSO
-
共享 Session 存储 使用 Redis 或数据库存储 Session,确保多个应用可以访问同一 Session 数据。
// 配置 Redis 作为 Session 处理器 ini_set('session.save_handler', 'redis'); ini_set('session.save_path', 'tcp://redis-server:6379'); session_start(); -
统一认证中心 创建一个独立的认证服务,其他应用通过重定向到该服务进行登录验证。
// 认证中心登录验证 if ($_POST['username'] && $_POST['password']) { $_SESSION['user'] = $_POST['username']; header('Location: ' . $_GET['return_url'] . '?token=' . session_id()); } -
应用端验证 Token 应用接收到 Token 后,向认证中心验证其有效性。
// 应用端验证 Token $token = $_GET['token']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "http://auth-center/validate?token=$token"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); if ($response === 'valid') { $_SESSION['user'] = json_decode($response)->user; }
基于 JWT 的 SSO
-
认证中心生成 JWT 用户登录成功后,认证中心生成 JWT 并返回给客户端。
use Firebase\JWT\JWT; $key = 'secret_key'; $payload = [ 'user_id' => 123, 'exp' => time() + 3600 ]; $jwt = JWT::encode($payload, $key); -
客户端存储 JWT 客户端将 JWT 存储在 Cookie 或 LocalStorage 中,并在每次请求时携带。
// 前端存储 JWT localStorage.setItem('jwt', response.jwt); -
应用端验证 JWT 应用端接收到 JWT 后,使用相同的密钥进行验证。
try { $decoded = JWT::decode($_GET['jwt'], $key, ['HS256']); $_SESSION['user_id'] = $decoded->user_id; } catch (Exception $e) { // 处理无效 Token }
使用 OAuth2 实现 SSO
-
配置 OAuth2 服务 使用如
league/oauth2-server库搭建 OAuth2 服务。use League\OAuth2\Server\AuthorizationServer; // 初始化 AuthorizationServer -
客户端集成 应用通过 OAuth2 流程获取 Access Token。
// 客户端重定向到认证中心 header('Location: http://auth-center/authorize?response_type=code&client_id=xxx&redirect_uri=xxx'); -
验证 Access Token 应用使用 Access Token 访问受保护资源。

$response = file_get_contents('http://auth-center/resource?access_token=' . $accessToken);
注意事项
- 安全性:确保所有通信使用 HTTPS,防止 Token 泄露。
- Token 过期:设置合理的 Token 过期时间,减少安全风险。
- 跨域问题:如果应用在不同域名下,需处理 CORS 和 Cookie 的跨域问题。
以上方法可根据实际需求选择或组合使用。基于 Session 共享适合内部系统,JWT 适合分布式系统,OAuth2 适合第三方集成。






