当前位置:首页 > 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实现分页的基本方法 使用LIMIT和OFFSET进行数据库查询分页。通过计算当前页码和每页显示数量,动态生成SQL语句。 $page = isset($_GET['page']) ? (int…

php实现验证码

php实现验证码

PHP实现验证码的方法 使用GD库生成验证码 GD库是PHP中处理图像的扩展,可用于生成验证码图片。 <?php session_start(); $width = 120; $height…

php实现mysql

php实现mysql

PHP 连接 MySQL 的基本方法 PHP 提供了多种方式与 MySQL 数据库进行交互,以下是最常用的几种方法。 使用 MySQLi 扩展 MySQLi 是 MySQL 的改进扩展,支持面向对…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php实现文件的下载

php实现文件的下载

PHP 实现文件下载的方法 在 PHP 中实现文件下载功能通常需要设置正确的 HTTP 头信息,并输出文件内容。以下是几种常见的实现方式: 使用 header() 函数强制下载 通过设置 Conte…

php实现分类

php实现分类

PHP实现分类的方法 数据库设计 创建分类表时,通常需要包含id、名称、父级id等字段。父级id用于实现多级分类结构。 CREATE TABLE categories ( id INT AU…