当前位置:首页 > 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中,递归需要明确的终止条件(基线条件),否则会导致无限循环。 递归实现阶乘 阶乘是经典的递归案例,n! =…

php 登录实现

php 登录实现

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

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Session 是…

php实现的分页

php实现的分页

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

php怎么实现登录功能

php怎么实现登录功能

数据库准备 创建用户表存储登录信息,通常包括用户名、密码(需加密)等字段。示例SQL: CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY…

php 实现排序

php 实现排序

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