Проверка ключа сброса пароля в WordPress: что такое CHECK_PASSWORD_RESET_KEY()?

Проверка ключа сброса пароля в WordPress

Что такое CHECK_PASSWORD_RESET_KEY()?

Функция CHECK_PASSWORD_RESET_KEY() используется для проверки ключа сброса пароля и логина пользователя. Она может помочь в восстановлении доступа к аккаунту, когда пользователь забывает свой пароль.

Примечание о ключе

Ключ считается "истекшим", если он точно совпадает со значением поля user_activation_key, а не проверяется после процедуры хеширования. Это означает, что старые значения ключей больше не принимаются, что позволяет предоставлять пользователям хорошую обратную связь.

Крюки (Hooks) функции

  • password_reset_expiration — фильтр для времени действия ключа сброса пароля.
  • password_reset_key_expired — фильтр для обработки старого ключа.

Возвращаемое значение

Функция возвращает объект WP_User в случае успешной проверки ключа или WP_Error, если ключ недействителен или просрочен.

Как использовать

check_password_reset_key( $key, $login );
  • $key (string) — ключ для проверки пароля пользователя.
  • $login (string) — логин пользователя.

Примеры использования

Пример создания и проверки ключа для сброса пароля

// Создаем ключ для пользователя с ID 1 и логином "siesta"
$user = get_userdata( 1 );

$key = get_password_reset_key( $user ); // Пример ключа: ZedUm9FEt48Kp4aGb5i8

// Проверяем созданный ключ
$ok = check_password_reset_key( $key, 'siesta' );

if ( is_wp_error( $ok ) ) {
    echo $ok->get_error_message(); // Если ключ недействителен, выводим сообщение об ошибке
} else {
    echo 'Ключ был проверен. Теперь вы можете отправить новый пароль на email.'; // Успешная проверка
}

Важные заметки

  • Переменная $wp_hasher используется для хеширования паролей с помощью стандартной библиотеки PHP.
  • По умолчанию время действия ключа сброса пароля составляет один день.

Как работает код функции check_password_reset_key

Вот как выглядит основная логика работы функции:

function check_password_reset_key( $key, $login ) {
    global $wp_hasher;

    $key = preg_replace( '/[^a-z0-9]/i', '', $key ); // Очищаем ключ от недопустимых символов

    if ( empty( $key ) || ! is_string( $key ) ) {
        return new WP_Error( 'invalid_key', __( 'Недействительный ключ.' ) );
    }

    if ( empty( $login ) || ! is_string( $login ) ) {
        return new WP_Error( 'invalid_key', __( 'Недействительный логин.' ) );
    }

    $user = get_user_by( 'login', $login ); // Получаем пользователя по логину

    if ( ! $user ) {
        return new WP_Error( 'invalid_key', __( 'Недействительный логин.' ) );
    }

    if ( empty( $wp_hasher ) ) {
        require_once ABSPATH . WPINC . '/class-phpass.php';
        $wp_hasher = new PasswordHash( 8, true ); // Инициализируем хешер
    }

    $expiration_duration = apply_filters( 'password_reset_expiration', DAY_IN_SECONDS ); // Получаем время действия ключа

    if ( str_contains( $user->user_activation_key, ':' ) ) {
        list( $pass_request_time, $pass_key ) = explode( ':', $user->user_activation_key, 2 );
        $expiration_time = $pass_request_time + $expiration_duration; // Устанавливаем время истечения
    } else {
        $pass_key = $user->user_activation_key;
        $expiration_time = false; // Если ключа нет, устанавливаем значение в false
    }

    if ( ! $pass_key ) {
        return new WP_Error( 'invalid_key', __( 'Недействительный ключ.' ) );
    }

    $hash_is_correct = $wp_hasher->CheckPassword( $key, $pass_key ); // Проверяем хеш ключа

    if ( $hash_is_correct && $expiration_time && time() < $expiration_time ) {
        return $user; // Возвращаем пользователя, если ключ действителен
    } elseif ( $hash_is_correct && $expiration_time ) {
        return new WP_Error( 'expired_key', __( 'Ключ истек.' ) ); // Ключ просрочен
    }

    if ( hash_equals( $user->user_activation_key, $key ) || ( $hash_is_correct && ! $expiration_time ) ) {
        return apply_filters( 'password_reset_key_expired', new WP_Error( 'expired_key', __( 'Ключ истек.' ) ), $user->ID ); // Для старых ключей
    }

    return new WP_Error( 'invalid_key', __( 'Недействительный ключ.' ) ); // Ключ недействителен
}

Заключение

Функция check_password_reset_key является важным инструментом в WordPress для управления процессом сброса пароля. Она помогает обеспечить безопасность и надежность, позволяя пользователям легко восстановить доступ к своим аккаунтам. Если у вас возникли вопросы по ее использованию или вы хотите узнать больше, обращайтесь за помощью!

Leave a Reply

Ваш адрес email не будет опубликован. Обязательные поля помечены *