WordPress API认证无法设置Cookie,提示Cookie被阻止错误
错误根源
你代码里的var_dump($response)会在WordPress设置登录Cookie的HTTP头之前输出内容,这直接触发了Cookie错误——WordPress要求在发送Cookie头之前不能有任何意外输出(包括调试信息、空格、HTML代码)。
修复后的完整代码
add_action('login_form', 'businessId', 10); function businessId() { ?> <div class="businessid_wrap"> <label for="businessId">business ID</label> <input type="text" id="businessId" name="businessId" value="<?php echo isset($_POST['businessId']) ? esc_attr($_POST['businessId']) : ''; ?>"/> </div> <?php } function au_auth($user, $username, $password) { // 如果已经有认证后的用户,直接返回 if ($user instanceof WP_User) { return $user; } $endpoint = '你的API端点URL'; // 检查必要字段是否存在 if (!$endpoint || empty($username) || empty($password) || !isset($_POST['businessId'])) { return $user; } $auth_args = [ 'method' => 'POST', 'headers' => [ 'Content-Type' => 'application/json', ], 'sslverify' => true, // 生产环境务必开启SSL验证 'body' => json_encode([ 'businessId' => sanitize_text_field($_POST['businessId']), 'userLogin' => sanitize_text_field($username), 'userPassword' => $password, ]), ]; $response = wp_remote_post($endpoint, $auth_args); // 处理API请求失败的情况 if (is_wp_error($response)) { return new WP_Error('api_error', __('API请求失败,请稍后重试。')); } $response_code = wp_remote_retrieve_response_code($response); $body = json_decode(wp_remote_retrieve_body($response), true); // 假设API返回200表示用户存在,返回404表示用户不存在需要创建 if ($response_code === 200 && !empty($body)) { // 检查WP中是否已有该用户 $existing_user = get_user_by('login', $username); if (!$existing_user) { // 创建新WP用户,这里可以根据API返回的信息补充用户资料 $user_id = wp_create_user($username, $password); if (is_wp_error($user_id)) { return $user_id; } $existing_user = get_user_by('id', $user_id); } // 返回认证后的用户对象 return $existing_user; } elseif ($response_code === 404) { return new WP_Error('user_not_found', __('用户名或密码错误,或该用户未在API系统中注册。')); } else { return new WP_Error('auth_failed', __('认证失败,请检查你的信息。')); } } add_filter('authenticate', 'au_auth', 10, 3);
关键修复点说明
- 移除了所有
var_dump调试输出,确保没有意外内容干扰Cookie设置 - 对
$_POST字段做了安全处理(sanitize_text_field、esc_attr),防止XSS攻击 - 修正了API请求的
body格式:因为设置了Content-Type: application/json,需要用json_encode()把数组转为JSON字符串,之前的数组格式会导致API无法正确解析 - 完善了认证逻辑:
- 先判断是否已有认证用户,避免重复处理
- 检查所有必要字段是否存在
- 处理API请求错误(用
is_wp_error()判断) - 根据API的HTTP状态码区分用户存在/不存在的情况,创建新用户后返回用户对象
- 生产环境开启
sslverify,避免安全风险
额外注意事项
- 请根据你的外部API实际返回规则调整
response_code和body的判断逻辑 - 可以给添加的business ID字段添加非ce验证,WordPress登录表单默认有
wp_nonce_field('log-in'),可以在提交时验证 - 密码字段不需要做转义或清洗,直接传递即可
内容的提问来源于stack exchange,提问作者sam kh
相关产品推荐
相关产品推荐

