Проверка ключа сброса пароля в 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 для управления процессом сброса пароля. Она помогает обеспечить безопасность и надежность, позволяя пользователям легко восстановить доступ к своим аккаунтам. Если у вас возникли вопросы по ее использованию или вы хотите узнать больше, обращайтесь за помощью!