当前位置:首页 > 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 子系统验证令牌有效性:

    php实现单点登陆

    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数组实现

php数组实现

PHP 数组的基本实现 PHP 数组是一种非常灵活的数据结构,可以存储多个值,并且支持多种类型的键(整数或字符串)。PHP 数组实际上是有序映射(ordered map),可以看作是列表(vector…

php mvc 实现

php mvc 实现

PHP MVC 实现方法 MVC(Model-View-Controller)是一种设计模式,用于分离应用程序的逻辑、数据和界面。以下是实现PHP MVC框架的关键步骤。 目录结构 创建以下目录结构…

php数据库实现

php数据库实现

PHP 连接 MySQL 数据库 使用 mysqli 扩展连接 MySQL 数据库: <?php $servername = "localhost"; $username = "usernam…

php 链表实现

php 链表实现

在 PHP 中实现链表可以通过类来模拟链表节点(Node)和链表(LinkedList)结构。以下是链表的完整实现示例,包含基础操作如插入、删除、遍历等。 链表节点类(Node) 链表的基本单元是节…

php session 实现购物车

php session 实现购物车

PHP Session 实现购物车的方法 初始化 Session 在 PHP 脚本的最开始调用 session_start() 函数,确保会话已启用。这通常在页面的顶部完成。 session_sta…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…