同域下WordPress REST API管理员登录时认证异常求助
问题
我在Vue应用中使用WordPress REST API进行身份验证,在localhost环境下运行完全正常,但将应用部署到与REST API同域的服务器后,当我以管理员身份登录时,接口返回未登录状态;退出登录后则可正常运行。
相关代码如下:
Vue应用代码
axios.get('https://example.com/wp-json/custom/v1/login-status/', { headers: { 'Authorization': `Bearer ${token}`, }, }) .then(response => { console.log(response.data); })
WordPress自定义端点代码
function custom_login_status_endpoint() { register_rest_route('custom/v1', '/login-status/', array( 'methods' => 'GET', 'callback' => 'check_login_status', 'permission_callback' => '__return_true', // Allow everyone )); } function check_login_status() { $user_data = wp_get_current_user(); $meta = get_user_meta(get_current_user_id()); $is_logged_in = is_user_logged_in(); return rest_ensure_response(array('is_logged_in' => $is_logged_in)); }
解决思路
处理Cookie与Bearer Token的优先级冲突:WordPress REST API默认优先使用Cookie认证(当存在后台登录Cookie时),会忽略请求头中的Bearer Token。管理员登录同域后台后,浏览器自动携带WP认证Cookie,导致服务器用Cookie会话而非Token进行验证,若Cookie会话异常就会返回未登录。解决方法是在自定义端点的回调中手动验证Bearer Token,跳过默认的Cookie优先逻辑:
function check_login_status($request) { $is_logged_in = false; // 提取并验证Bearer Token $auth_header = $request->get_header('Authorization'); if ($auth_header && strpos($auth_header, 'Bearer ') === 0) { $token = substr($auth_header, 7); // 这里根据你使用的JWT插件调用验证方法,以wp-api-jwt-auth为例 $user = JWT_Auth::validate_token($token); if (!is_wp_error($user)) { $is_logged_in = true; } } return rest_ensure_response(array('is_logged_in' => $is_logged_in)); }检查HTTPS环境下的Cookie配置:部署到HTTPS服务器后,WP登录Cookie的
Secure属性会自动设为true,若服务器HTTPS证书不被信任、SameSite配置不当,会导致Cookie无法被正确识别。可以在wp-config.php中手动调整Cookie参数:define('COOKIE_SECURE', true); define('COOKIE_SAMESITE', 'Lax'); // 同域场景下Lax足够排查服务器会话与安全插件问题:
- 检查PHP的
session.cookie_secure、session.cookie_samesite配置,确保与HTTPS环境适配; - 暂时禁用Wordfence等安全插件,验证是否是插件拦截了认证请求;
- 清除浏览器缓存与Cookie,重新登录后台和Vue应用后测试。
- 检查PHP的
添加日志排查细节:在自定义端点回调中添加日志,记录请求头和当前用户状态,方便定位问题:
function check_login_status() { error_log('Authorization Header: ' . $_SERVER['HTTP_AUTHORIZATION'] ?? 'None'); error_log('Current User ID: ' . get_current_user_id()); $is_logged_in = is_user_logged_in(); return rest_ensure_response(array('is_logged_in' => $is_logged_in)); }查看服务器错误日志,确认Token是否被正确接收,当前用户ID是否为0(未登录状态)。
内容的提问来源于stack exchange,提问作者jord49
相关产品推荐
相关产品推荐

