Сброс пароля WordPress на пользовательской странице входа получение ошибок = ошибка invalidkey

#php #wordpress #wordpress-login

#php #wordpress #wordpress-вход

Вопрос:

В моем 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) . "rnrn";
    $message .= site_url("wp-login.php?action=rpamp;key=$keyamp;login=" . rawurlencode($user_login), 'login') . "rnrn";

    return $message;
}
 

Приведенный выше код генерирует приведенный ниже URL-адрес и отправляет пользователю электронное письмо.

 https://www.example.com/wp-login.php?action=rpamp;key=XVBzvTRG17rKaG4brjH6amp;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 amp;amp; $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 ошибку.

Ответ №1:

Вы не назвали поле #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);
 

Ответ №2:

Ваша форма содержит pass1 и pass2 в качестве участников, но ваш сервер ожидает rp_key и rp_login , соответственно. Из-за этого они несовместимы, что приводит к нежелательному поведению, которое вы только что описали. Чтобы устранить проблему, вам нужно будет убедиться, что name s password input элементов в form совпадают с ключами, которые вы используете в серверной части, поэтому вам нужно будет либо form name соответствующим образом изменить s, либо ключи, которые вы предоставляете $ _REQUEST , чтобы получить их.

Комментарии:

1. rp_key это ключ сброса пароля для пользователя rp_login . В то pass1 pass2 время как поля и предназначены для создания нового пароля и проверки соответствия. Если я неправильно понимаю, дайте мне знать.

2. @theKing Я понимаю, что это намерение, но в форме нет вызываемого элемента rp_key . Серверная часть ожидает, что это существует, и передает его функции, как $user = check_password_reset_key($rp_key, $rp_login);