自定义登录页面中的 WordPress 密码重置出现错误 = 无效密钥错误

WordPress password reset in custom login page getting errors=invalidkey error

在我的 WordPress v5.7 中,我有自定义登录页面。

接受密码重置请求并从自定义登录页面发送电子邮件的代码下方。

add_filter("retrieve_password_message", "custom_password_reset", 99, 4);

function custom_password_reset($message, $key, $user_login, $user_data) {

    $key = get_password_reset_key($user_data);
    
    $message = sprintf(__('To reset password for %s, visit the following address:'), $user_data->user_email) . "\r\n\r\n";
    $message .= site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user_login), 'login') . "\r\n\r\n";

    return $message;
}

以上代码生成以下内容 URL 并向用户发送电子邮件。

https://www.example.com/wp-login.php?action=rp&key=XVBzvTRG17rKaG4brjH6&login=user_name

自定义密码重置页面中的表单如下:

<form name="resetpassform" id="resetpassform" action="<?php echo esc_url(network_site_url('wp-login.php?action=resetpass', 'login_post')); ?>" method="post" autocomplete="off">

    <input type="hidden" id="user_login" value="<?php echo $_GET['login']; ?>" autocomplete="off" />

    <input id="pass1" name="pass1" type="password" value="" placeholder="New Password" autocapitalize="off" data-reveal="1">
    <input id="pass2" name="pass2" type="password" value="" placeholder="Confirm New Password" autocapitalize="off">

   <input type="hidden" name="key" value="<?php echo $_GET['key']; ?>" />
     <button type="submit" id="resetpass-button" name="submit">Save New Password</button>
</form>

下面的代码应该验证密钥+登录并重置密码:

function do_password_reset() {
    if ('POST' == $_SERVER['REQUEST_METHOD']) {
        $rp_key = $_REQUEST['rp_key'];
        $rp_login = $_REQUEST['rp_login'];

        $user = check_password_reset_key($rp_key, $rp_login);

        if (!$user || is_wp_error($user)) {

            if ($user && $user->get_error_code() === 'expired_key') {
                wp_redirect(site_url('login/reset/?errors=expiredkey'));
            } else {
                wp_redirect(site_url('login/reset/?errors=invalidkey'));
            }
            exit;
        }

        if (isset($_POST['pass1'])) {
            if ($_POST['pass1'] != $_POST['pass2']) {
                // Passwords don't match
                .....
            }

            if (empty($_POST['pass1'])) {
                // Password is empty
                .....
            }
            
            // Parameter checks OK, reset password
            reset_password($user, $_POST['pass1']);
            wp_redirect(site_url('login?password=changed'));
        } else {
            echo "Invalid request.";
        }

        exit;
    }
}

add_action('login_form_rp', 'do_password_reset');
add_action('login_form_resetpass', 'do_password_reset');

用户无法从自定义登录页面重置密码并出现 errors=invalidkey 错误。

您的表单包含 pass1pass2 作为成员,但是您的后端分别需要 rp_keyrp_login。因此,两者不兼容,导致您刚才描述的不良行为。为了解决这个问题,您需要确保 formpassword input 元素的 name 与您在后端使用的键相匹配,所以您需要相应地更改 form name 或您提供给 $_REQUEST 的密钥才能获取它们。

您没有命名该字段 #user_login 请将其命名为 rp_login 以便您可以通过 $_REQUEST 获取它同样适用于 rp_key 您将其命名为 key

<input name="rp_login" type="hidden" id="user_login" value="<?php echo $_GET['login']; ?>" autocomplete="off" />

如果不命名字段,您将无法获得 $_REQUEST['rp_login'];

的值

请在调用您正在获取值的函数之前检查该值。

print_r([$rp_key , $rp_login ]);
die();
$user = check_password_reset_key($rp_key, $rp_login);