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

自定义登录表单登录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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:00:58