主站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
相关产品推荐
相关产品推荐

