You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

主站www.domain.com与子目录WordPress站点单点登录最优方案咨询

最优单点登录(SSO)实现方案(主站+子目录WordPress)

核心思路

抛弃用户数据同步和双会话维护逻辑,让WordPress完全依赖主站的身份验证结果,通过根域名共享Cookie传递身份状态,同时在WordPress中实现自定义身份验证逻辑,直接对接主站的用户接口,从根源解决数据冗余和会话同步问题。


具体实现步骤

1. 主站端:生成可信身份令牌

用户在主站登录成功后,生成加密且带过期时间的身份令牌,存储在根域名Cookie中(Domain=.domain.com),确保子目录的WordPress能读取到:

  • 令牌需包含用户唯一标识、过期时间戳、签名(防止篡改)
  • 伪代码示例:
// 主站登录成功后设置Cookie
$user_id = $_SESSION['user_id'];
$expire = time() + 86400; // 1天有效期
$signature = hash_hmac('sha256', "$user_id|$expire", '你的主站密钥');
$token = "$user_id|$expire|$signature";

// 设置根域Cookie,开启HttpOnly和Secure提升安全性
setcookie('main_site_auth', $token, $expire, '/', '.domain.com', true, true);

2. WordPress端:自定义身份验证插件

开发轻量插件替代WordPress默认验证流程,核心逻辑如下:

2.1 拦截登录检查,验证主站令牌

使用wp_authenticate钩子,优先验证主站Cookie中的身份令牌:

add_filter('wp_authenticate', 'main_site_authenticate', 10, 2);
function main_site_authenticate($user, $username) {
    // 已有WP用户则直接返回
    if (is_a($user, 'WP_User')) return $user;

    // 无主站令牌则走默认验证
    if (!isset($_COOKIE['main_site_auth'])) return $user;

    $token = $_COOKIE['main_site_auth'];
    list($user_id, $expire, $signature) = explode('|', $token);

    // 验证令牌有效性
    if (time() > $expire) return $user;
    $valid_signature = hash_hmac('sha256', "$user_id|$expire", '你的主站密钥');
    if ($signature !== $valid_signature) return $user;

    // 调用主站接口获取用户信息
    $api_url = 'https://www.domain.com/api/get_user_info.php?id=' . $user_id;
    $response = wp_remote_get($api_url, ['sslverify' => true]);
    if (is_wp_error($response)) return $user;

    $user_data = json_decode(wp_remote_retrieve_body($response), true);
    if (!$user_data) return $user;

    // 按需创建WP用户(仅首次访问时创建,避免冗余)
    $wp_user = get_user_by('login', $user_data['email']);
    if (!$wp_user) {
        $wp_user_id = wp_create_user($user_data['email'], wp_generate_password(12, false), $user_data['email']);
        $wp_user = get_user_by('id', $wp_user_id);
        // 同步用户昵称、角色等信息
        wp_update_user([
            'ID' => $wp_user_id,
            'display_name' => $user_data['nickname'],
            'role' => 'subscriber' // 可根据主站角色映射调整
        ]);
    }

    // 自动登录WordPress
    wp_set_auth_cookie($wp_user->ID, true);
    return $wp_user;
}

2.2 拦截未登录访问,重定向到主站

使用template_redirect钩子,未登录用户访问WordPress时跳转到主站登录页:

add_action('template_redirect', 'redirect_to_main_site_login');
function redirect_to_main_site_login() {
    // 排除WP后台登录页(若需禁用后台登录可移除该行)
    if (strpos($_SERVER['REQUEST_URI'], '/wp-login.php') !== false) return;

    if (!is_user_logged_in()) {
        $redirect_url = urlencode($_SERVER['REQUEST_URI']);
        wp_redirect("https://www.domain.com/login?redirect=$redirect_url");
        exit;
    }
}

2.3 同步登出操作

WordPress登出时,清除主站身份Cookie并调用主站登出接口销毁会话:

add_action('wp_logout', 'sync_logout_with_main_site');
function sync_logout_with_main_site() {
    // 清除主站身份Cookie
    setcookie('main_site_auth', '', time() - 3600, '/', '.domain.com', true, true);
    // 调用主站登出接口销毁会话
    wp_remote_get('https://www.domain.com/api/logout.php', ['sslverify' => true]);
}

3. 主站端:登出同步处理

主站登出时,清除根域身份Cookie,确保WordPress会话同步失效:

// 主站登出逻辑
function main_site_logout() {
    session_destroy();
    // 清除身份Cookie
    setcookie('main_site_auth', '', time() - 3600, '/', '.domain.com', true, true);
    header('Location: /');
    exit;
}

方案优势

  • 无冗余数据:WordPress仅在用户首次访问时按需创建用户,后续直接依赖主站身份验证
  • 单会话管理:仅通过主站身份令牌Cookie实现状态同步,避免双会话维护成本
  • 高安全性:令牌签名防止篡改,Cookie开启HttpOnly和Secure属性降低XSS风险
  • 强扩展性:主站用户信息更新时,可通过接口同步到WordPress

内容的提问来源于stack exchange,提问作者Yasmeen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 01:08:27