当前位置:首页 > PHP

php实现单点登陆

2026-01-29 05:49:39PHP

PHP实现单点登录(SSO)的方法

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

基于Token的SSO实现

  1. 生成Token 用户登录后生成唯一Token并存储至数据库或缓存中:

    $token = bin2hex(random_bytes(32));
    $_SESSION['sso_token'] = $token;
    // 存储至数据库
    $stmt = $pdo->prepare("INSERT INTO sso_tokens (user_id, token) VALUES (?, ?)");
    $stmt->execute([$user_id, $token]);
  2. 跨域共享Token 通过子域Cookie或前端传递实现:

    // 设置跨域Cookie(需相同顶级域名)
    setcookie('sso_token', $token, time()+3600, '/', '.example.com');
  3. 验证Token 子系统通过接口验证Token有效性:

    $token = $_COOKIE['sso_token'] ?? '';
    $stmt = $pdo->prepare("SELECT user_id FROM sso_tokens WHERE token = ?");
    $stmt->execute([$token]);
    $user = $stmt->fetch();

基于OAuth2的实现

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

    use League\OAuth2\Server\AuthorizationServer;
    $server = new AuthorizationServer(
        $clientRepository,
        $accessTokenRepository,
        $scopeRepository,
        $privateKey,
        $encryptionKey
    );
  2. 获取授权码 用户登录后重定向至授权端点:

    header("Location: https://sso.example.com/auth?response_type=code&client_id=CLIENT_ID&redirect_uri=CALLBACK_URL");
  3. 交换访问令牌 子系统用授权码获取令牌:

    $response = $http->post('https://sso.example.com/token', [
        'grant_type' => 'authorization_code',
        'code' => $_GET['code'],
        'client_id' => CLIENT_ID,
        'client_secret' => CLIENT_SECRET
    ]);

基于JWT的实现

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

    use Firebase\JWT\JWT;
    $payload = [
        'iss' => 'sso-server',
        'sub' => $user_id,
        'exp' => time() + 3600
    ];
    $jwt = JWT::encode($payload, SECRET_KEY, 'HS256');
  2. 验证JWT 子系统验证令牌有效性:

    try {
        $decoded = JWT::decode($jwt, SECRET_KEY, ['HS256']);
        $user_id = $decoded->sub;
    } catch (Exception $e) {
        // 处理无效令牌
    }

实现注意事项

  • 确保所有通信使用HTTPS加密
  • Token需设置合理过期时间
  • 实现全局注销机制,清除所有系统的会话
  • 考虑使用Redis集中存储Token以提高性能

完整示例流程

  1. 用户访问system1.example.com
  2. 未登录时重定向至sso.example.com/login
  3. 登录成功后生成Token并重定向回原系统
  4. system1通过Token获取用户信息建立本地会话
  5. 用户访问system2.example.com时自动通过共享Token完成登录

以上方案可根据实际需求组合使用,OAuth2适合第三方系统集成,而Token/JWT方案更适合内部系统SSO实现。

php实现单点登陆

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

相关文章

git php实现

git php实现

Git 与 PHP 的集成实现 使用 PHP 执行 Git 命令 通过 PHP 的 exec()、shell_exec() 或 passthru() 函数可以直接调用 Git 命令,适用于服务器端操作…

php实现websocket

php实现websocket

PHP 实现 WebSocket WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。PHP 可以通过多种方式实现 WebSocket 功能,以下是几种常见的方法: 使用 Rat…

php 登录实现

php 登录实现

PHP 登录实现 PHP 登录功能通常包括用户认证、会话管理和安全性措施。以下是实现 PHP 登录功能的关键步骤。 数据库准备 创建一个用户表存储用户信息,通常包括用户名、密码(加密存储)和其他必…

php 实现验证码

php 实现验证码

使用 PHP 生成验证码 验证码(CAPTCHA)用于防止自动化脚本提交表单,以下是几种常见的 PHP 实现方法。 使用 GD 库生成图片验证码 GD 库是 PHP 的图像处理扩展,可用于生成验证…

php验证码的实现

php验证码的实现

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

php搜索功能实现

php搜索功能实现

实现基本的PHP搜索功能 使用MySQL数据库和PHP实现简单的关键词搜索功能。需要确保数据库中有可供搜索的表和数据。 // 连接数据库 $conn = new mysqli('localhost'…