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

同域下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应用后测试。
  • 添加日志排查细节:在自定义端点回调中添加日志,记录请求头和当前用户状态,方便定位问题:

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:39