当前位置:首页 > PHP

php实现sso

2026-04-03 02:15:09PHP

PHP 实现 SSO(单点登录)

SSO(Single Sign-On)允许用户通过一次登录访问多个系统。以下是使用 PHP 实现 SSO 的常见方法:

基于 Session 共享的 SSO

  1. 共享 Session 存储 使用 Redis 或数据库存储 Session,确保多个应用可以访问同一 Session 数据。

    // 配置 Redis 作为 Session 处理器
    ini_set('session.save_handler', 'redis');
    ini_set('session.save_path', 'tcp://redis-server:6379');
    session_start();
  2. 统一认证中心 创建一个独立的认证服务,其他应用通过重定向到该服务进行登录验证。

    // 认证中心登录验证
    if ($_POST['username'] && $_POST['password']) {
        $_SESSION['user'] = $_POST['username'];
        header('Location: ' . $_GET['return_url'] . '?token=' . session_id());
    }
  3. 应用端验证 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

  1. 认证中心生成 JWT 用户登录成功后,认证中心生成 JWT 并返回给客户端。

    use Firebase\JWT\JWT;
    
    $key = 'secret_key';
    $payload = [
        'user_id' => 123,
        'exp' => time() + 3600
    ];
    $jwt = JWT::encode($payload, $key);
  2. 客户端存储 JWT 客户端将 JWT 存储在 Cookie 或 LocalStorage 中,并在每次请求时携带。

    // 前端存储 JWT
    localStorage.setItem('jwt', response.jwt);
  3. 应用端验证 JWT 应用端接收到 JWT 后,使用相同的密钥进行验证。

    try {
        $decoded = JWT::decode($_GET['jwt'], $key, ['HS256']);
        $_SESSION['user_id'] = $decoded->user_id;
    } catch (Exception $e) {
        // 处理无效 Token
    }

使用 OAuth2 实现 SSO

  1. 配置 OAuth2 服务 使用如 league/oauth2-server 库搭建 OAuth2 服务。

    use League\OAuth2\Server\AuthorizationServer;
    // 初始化 AuthorizationServer
  2. 客户端集成 应用通过 OAuth2 流程获取 Access Token。

    // 客户端重定向到认证中心
    header('Location: http://auth-center/authorize?response_type=code&client_id=xxx&redirect_uri=xxx');
  3. 验证 Access Token 应用使用 Access Token 访问受保护资源。

    php实现sso

    $response = file_get_contents('http://auth-center/resource?access_token=' . $accessToken);

注意事项

  • 安全性:确保所有通信使用 HTTPS,防止 Token 泄露。
  • Token 过期:设置合理的 Token 过期时间,减少安全风险。
  • 跨域问题:如果应用在不同域名下,需处理 CORS 和 Cookie 的跨域问题。

以上方法可根据实际需求选择或组合使用。基于 Session 共享适合内部系统,JWT 适合分布式系统,OAuth2 适合第三方集成。

标签: phpsso
分享给朋友:

相关文章

php实现队列

php实现队列

PHP实现队列的方法 队列是一种先进先出(FIFO)的数据结构,PHP可以通过多种方式实现队列功能。 使用数组模拟队列 PHP数组可以模拟队列的基本操作,通过array_push和array_shi…

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php长连接实现

php长连接实现

PHP 长连接实现方法 长连接(Keep-Alive)允许客户端与服务器在一次TCP连接中发送和接收多个HTTP请求/响应,减少重复建立连接的开销。以下是PHP中实现长连接的几种方式: 配置HTTP…

php 实现排序

php 实现排序

PHP 实现数组排序的方法 PHP 提供了多种内置函数和方法来实现数组排序,适用于不同的排序需求。以下是一些常见的排序实现方式: 使用 sort() 函数对数组进行升序排序 sort() 函数对数组…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php实现获取验证码

php实现获取验证码

使用GD库生成验证码 在PHP中,可以通过GD库来生成验证码图片。以下是一个简单的实现示例: <?php session_start(); $width = 120; $height = 40…