当前位置:首页 > PHP

php实现单点登录

2026-04-02 19:32:09PHP

单点登录(SSO)简介

单点登录(Single Sign-On,SSO)是一种身份验证机制,允许用户通过一次登录访问多个相互信任的应用系统。PHP实现SSO的核心在于共享会话或令牌验证。

基于共享会话的实现

共享会话是最简单的SSO实现方式,适用于同一主域下的子域应用。

步骤

  1. 设置共享会话
    在PHP中,通过设置session.cookie_domain为父级域名(如.example.com),使子域(如app1.example.comapp2.example.com)共享会话。

    ini_set('session.cookie_domain', '.example.com');
    session_start();
  2. 验证登录状态
    在每个子域应用中检查会话中的用户信息:

    session_start();
    if (isset($_SESSION['user_id'])) {
        // 用户已登录
    } else {
        // 跳转到统一登录页
        header('Location: https://sso.example.com/login.php');
    }

基于令牌(Token)的实现

适用于跨域场景,通过生成并验证令牌实现SSO。

步骤

  1. 生成令牌
    登录成功后,生成一个加密令牌并存储到数据库或缓存中:

    $token = bin2hex(random_bytes(32));
    $_SESSION['token'] = $token;
    // 存储到数据库(可选)
    $db->query("INSERT INTO sso_tokens (token, user_id, expires_at) VALUES ('$token', $user_id, NOW() + INTERVAL 1 HOUR)");
  2. 传递令牌
    通过URL参数或POST请求将令牌传递给其他应用:

    $redirect_url = "https://app2.example.com/verify.php?token=" . urlencode($token);
    header("Location: $redirect_url");
  3. 验证令牌
    目标应用接收令牌并验证有效性:

    $token = $_GET['token'];
    $result = $db->query("SELECT user_id FROM sso_tokens WHERE token = '$token' AND expires_at > NOW()");
    if ($result->num_rows > 0) {
        // 令牌有效,创建本地会话
        $_SESSION['user_id'] = $result->fetch_assoc()['user_id'];
    }

使用OAuth2.0协议

对于更复杂的跨域SSO,可以集成OAuth2.0(如使用league/oauth2-server库)。

步骤

  1. 安装OAuth2.0库

    composer require league/oauth2-server
  2. 配置授权服务器
    实现令牌颁发和验证逻辑:

    use League\OAuth2\Server\AuthorizationServer;
    // 配置授权服务器(略)
  3. 客户端集成
    应用通过OAuth2.0流程获取访问令牌:

    php实现单点登录

    // 使用Guzzle等库请求令牌
    $response = $http->post('https://sso.example.com/oauth/token', [
        'form_params' => [
            'grant_type' => 'authorization_code',
            'code' => $_GET['code'],
        ],
    ]);

安全注意事项

  • 使用HTTPS传输令牌。
  • 设置令牌过期时间(如1小时)。
  • 对敏感操作进行二次验证。

以上方法可根据实际需求选择,共享会话适合简单场景,令牌或OAuth2.0适合分布式系统。

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

相关文章

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…

php实现支付宝支付

php实现支付宝支付

支付宝支付集成步骤 准备工作 在开始集成支付宝支付前,确保已注册支付宝开放平台账号并完成企业实名认证。创建应用后获取APPID、应用私钥和支付宝公钥。 配置支付宝SDK 通过Composer安装支付…

php 路由实现的

php 路由实现的

PHP 路由实现方法 基于原生 PHP 实现路由 创建一个简单的路由解析器,通过解析 URL 路径来调用对应的控制器或函数。 // 定义路由表 $routes = [ '/' => '…

php 实现路由

php 实现路由

PHP 实现路由的方法 在 PHP 中实现路由功能可以通过多种方式完成,以下是几种常见的实现方法: 使用原生 PHP 实现简单路由 通过解析 URL 并匹配对应的处理逻辑,可以实现基本的路由功能。以…

php下载文件实现

php下载文件实现

PHP 下载文件实现方法 使用 header() 函数强制下载 设置合适的 HTTP 头信息,强制浏览器下载文件而非直接打开。 $file_path = '/path/to/file.pdf'; $…