自定义登录表单登录WordPress后访问后台需重验证问题
WordPress AJAX登录后后台需二次验证的问题修复
问题根源分析
你遇到的reauth=1重定向,本质是WordPress未识别到有效的登录会话。核心问题出在以下几点:
wp_signon的$secure参数设置错误,导致HTTPS环境下登录Cookie无法正确生效- 自定义的nonce过期逻辑完全多余,且不符合WordPress的nonce机制
- AJAX成功后未触发会话的正确初始化
修复后的代码
PHP服务端代码
// Ajax action handler for login-form.php function login_handler() { // 验证Nonce(使用WordPress原生机制即可) if ( !wp_verify_nonce( $_POST['nonce'], 'login-form-nonce' ) ){ wp_send_json_error( array('message' => __( 'Invalid Token', 'text-domain' ) ) ); } // 登录逻辑 $creds = array( 'user_login' => sanitize_text_field( $_POST['username'] ), 'user_password' => $_POST['password'], 'remember' => isset( $_POST['remember'] ) ? true : false // 可选:添加记住我功能 ); // 关键:让WordPress自动判断是否使用Secure Cookie,而非强制设为false $user = wp_signon( $creds, is_ssl() ); if ( is_wp_error( $user ) ){ wp_send_json_error( array('message' => __( 'Wrong username or password', 'text-domain' ) ) ); } else { // 手动初始化用户会话(确保AJAX请求后会话生效) wp_set_current_user( $user->ID ); wp_set_auth_cookie( $user->ID, isset( $_POST['remember'] ) ); wp_send_json_success( array( 'message' => 'Login Success, redirect...', 'username' => $user->user_login, 'redirect' => admin_url() // 返回后台地址用于跳转 ) ); } wp_die(); }
JavaScript客户端代码
<div class="login-form-wrapper"> <form id="login-form" method="post"> <div class="login_form_fields uname"> <label for="username">Email / Username</label> <input type="text" id="username" name="username" required> </div> <div class="login_form_fields pswrd"> <label for="password">Password</label> <input type="password" id="password" name="password" required> <span id="password-toggle" class="fa-light fa-eye"></span> </div> <!-- 可选:添加记住我复选框 --> <div class="login_form_fields remember"> <input type="checkbox" id="remember" name="remember"> <label for="remember">Remember Me</label> </div> <input type="hidden" name="nonce" value="<?php echo wp_create_nonce( 'login-form-nonce' ); ?>"> <div id="login-form-message"></div> <button class="login_button" type="submit">Login</button> </form> </div> <script> jQuery(document).ready(function($) { $('#login-form').submit(function(e) { e.preventDefault(); var form = $(this); var username = form.find('#username').val().trim(); var password = form.find('#password').val().trim(); var remember = form.find('#remember').is(':checked'); // 验证输入格式 var regex = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$|^[A-Za-z0-9._-]+$/; if (!regex.test(username)) { $('#login-form-message').html("Invalid username or email"); return; } var data = { 'action': 'login', 'username': username, 'password': password, 'remember': remember, 'nonce': form.find('input[name="nonce"]').val() }; $.ajax({ type: 'POST', url: '<?php echo admin_url( 'admin-ajax.php' ); ?>', data: data, success: function(response) { if (response.success) { $('#login-form-message').html('<lottie-player src="https://assets9.lottiefiles.com/packages/lf20_ht6o1bdu.json" background="transparent" speed="1" style="width: 150px; height: 150px;" loop autoplay></lottie-player> Logging in as ' + response.data.username); setTimeout(function(){ // 跳转到后台 window.location.href = response.data.redirect; }, 1500); } else { $('#login-form-message').html(response.data.message); } }, error: function() { $('#login-form-message').html("Login failed, please try again"); } }); }); }); </script>
额外注意事项
- 确保你的站点已正确配置HTTPS(如果使用HTTPS),WordPress的
WP_HOME和WP_SITEURL应设置为HTTPS地址 - 不要自定义nonce的过期逻辑,WordPress原生nonce默认12小时过期,且会自动刷新
- 登录后必须通过
wp_set_current_user和wp_set_auth_cookie手动初始化会话,因为AJAX请求不会自动触发这些流程
内容的提问来源于stack exchange,提问作者GorillaDev
相关产品推荐
相关产品推荐

