当前位置:首页 > 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 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php实现排序

php实现排序

PHP 数组排序方法 PHP 提供了多种内置函数用于数组排序,适用于不同的排序需求。以下是常见的排序方法: 按值升序排序 sort() 函数对数组按值升序排序,重置键名(索引数组适用): $num…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

php实现统计

php实现统计

PHP 实现统计功能 在 PHP 中实现统计功能通常涉及数据的收集、处理和展示。以下是一些常见的统计实现方法: 数据库数据统计 通过 SQL 查询可以直接从数据库中获取统计结果: $conn =…

php实现文章

php实现文章

PHP实现文章管理功能 在PHP中实现文章管理功能通常涉及数据库操作、表单处理和页面展示。以下是实现文章管理的基本步骤: 数据库设计 创建articles表,包含字段如id、title、conten…