当前位置:首页 > PHP

php 单点登录实现

2026-02-27 12:37:05PHP

PHP 单点登录实现方案

单点登录(SSO)允许用户通过一次登录访问多个系统。以下是基于PHP的常见实现方法:

基于Token的SSO实现

  1. 生成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小时过期
    ]);
  2. 验证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的实现

  1. 授权服务器配置 使用league/oauth2-server库:

    php 单点登录实现

    $server = new \League\OAuth2\Server\AuthorizationServer(
     $clientRepository,
     $accessTokenRepository,
     $scopeRepository,
     $privateKey,
     $encryptionKey
    );
  2. 获取授权码

    $authRequest = $server->validateAuthorizationRequest($request);
    $authRequest->setUser($userEntity);
    $authRequest->setAuthorizationApproved(true);
    return $server->completeAuthorizationRequest($authRequest, $response);
  3. 子系统验证

    $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的实现

  1. 生成JWT Token 使用firebase/php-jwt库:

    php 单点登录实现

    use Firebase\JWT\JWT;
    $payload = [
     'iss' => 'sso-server',
     'sub' => $user_id,
     'exp' => time() + 3600
    ];
    $jwt = JWT::encode($payload, $secretKey);
  2. 验证JWT

    try {
     $decoded = JWT::decode($jwt, $secretKey, ['HS256']);
     $user_id = $decoded->sub;
    } catch (Exception $e) {
     // 验证失败处理
    }

跨域会话共享方案

  1. 主域名Cookie设置

    setcookie(
     'sso_session', 
     $session_id, 
     time() + 3600, 
     '/', 
     '.example.com', // 主域名
     true, 
     true
    );
  2. 子系统验证 通过iframe或API与主站通信:

    // 客户端检查
    window.addEventListener('message', function(e) {
     if (e.origin === 'https://sso.example.com') {
         if (e.data.loggedIn) {
             // 已登录处理
         }
     }
    });

安全注意事项

  • 所有Token应设置合理过期时间
  • 使用HTTPS传输敏感数据
  • 实现CSRF防护机制
  • 定期清理过期Token
  • 对敏感操作要求重新认证

以上方案可根据实际需求组合使用,大型系统建议采用OAuth2或SAML标准协议。

标签: 单点php
分享给朋友:

相关文章

php 路由实现

php 路由实现

PHP 路由实现方法 在 PHP 中实现路由功能有多种方式,以下是几种常见的实现方法: 使用原生 PHP 实现 通过解析 URL 并匹配对应的控制器和动作: $request = $_SERVER…

php验证码的实现

php验证码的实现

PHP 验证码实现方法 使用 GD 库生成基础验证码 创建画布并生成随机字符串作为验证码内容: session_start(); $width = 120; $height = 40; $image…

php 实现文件下载

php 实现文件下载

实现文件下载的基本方法 使用 PHP 实现文件下载的核心是通过设置 HTTP 头部信息,强制浏览器将文件作为附件下载而非直接显示。以下是一个基础实现示例: $file_path = '/path/t…

php 函数实现

php 函数实现

PHP 函数实现基础 PHP 函数的定义使用 function 关键字,后跟函数名和参数列表。函数名不区分大小写,但建议保持一致。 function functionName($param1, $p…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…