check_password_reset_key() WP 3.1.0

Перевіряє (порівнює) переданий ключ відновлення пароля з хешом цього ключа в БД.

Хеш ключа створюється функцією get_password_reset_key() під час запиту відновлення пароля і зберігається в БД, таблиці, wp_users в полі user_activation_key .

Збережений у БД ключ придатний один день (добу) з моменту його створення.

Повертає

WP_User|WP_Error.

  • Об’єкт WP_User, якщо вказаний ключ пройшов перевірку (рівний хешу).
  • Об’єкт WP_Error якщо ключ не дорівнює хеш або прострочений.

Використання

check_password_reset_key($key, $login);
$key
(рядок) (обов’язковий)
Ключ для порівняння з хеш. Цей ключ зазвичай надсилається на пошту як посилання.
$login
(рядок) (обов’язковий)
Логін користувача, хеш ключа якого потрібно отримати з БД та порівняти зі значенням
$key .

Приклади

0

#1 Приклад створення та перевірки ключа для відновлення пароля

// Створимо ключ для користувача 1 з логіном siesta
$ user = get_userdata( 1 );

$key = get_password_reset_key($user); // ZedUm9FEt48Kp4aGb5i8

// Перевіримо створений ключ
$ is_ok = check_password_reset_key ($ key, 'siesta');

if( is_wp_error($is_ok) ){
	echo $is_ok->get_error_message();
}
else {
	echo 'Ключ пройшов перевірку. Можна надсилати новий пароль на пошту.';
}

нотатки

  • Global. wpdb. $wpdb WordPress Database object for queries.
  • Global. PasswordHash. $wp_hasher Portable PHP password hashing framework instance.

список змін

З версії 3.1.0Введено.

Код check_password_reset_key() WP 6.0.2

function check_password_reset_key( $key, $login ) {
	Global $wpdb, $wp_hasher;

	$key = preg_replace( '/[^a-z0-9]/i', '', $key );

	if ( empty( $key ) || ! is_string( $key ) ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	if ( empty( $login ) || ! is_string( $login ) ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	$user = get_user_by( 'login', $login );

	if ( ! $user ) {
		return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
	}

	if ( empty( $wp_hasher ) ) {
		require_once ABSPATH. WPINC. '/class-phpass.php';
		$wp_hasher = New PasswordHash(8, true);
	}

	/**
	 * Filters the expiration time of password reset keys.
	 *
	 * @ Since 4.3.0
	 *
	 * @param int $expiration Опис часу в секундах.
	 */
	$expiration_duration = apply_filters( 'password_reset_expiration', DAY_IN_SECONDS );

	if ( false !== strpos( $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;
	}

	if (! $pass_key) {
		return new WP_Error( 'invalid_key', __( '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 ) {
		// Key has an expiration time that's passed.
		return new WP_Error( 'expired_key', __( 'Invalid key.' ) );
	}

	if ( hash_equals( $user->user_activation_key, $key ) || ( $ hash_is_correct && ! $expiration_time ) ) {
		$return = new WP_Error( 'expired_key', __( 'Invalid key.' ) );
		$user_id = $user->ID;

		/**
		 * Filters the return value of check_password_reset_key() when an
		 * old-style key is used.
		 *
		 * @since 3.7.0 Спочатку plain-text keys були stored in the database.
		 * @since 4.3.0 Спочатку key hashes були stored without an expiration time.
		 *
		 * @param WP_Error $return A WP_Error object denoting an expired key.
		 * Return a WP_User object to validate the key.
		 * @param int $user_id Matched user ID.
		 */
		return apply_filters( 'password_reset_key_expired', $return, $user_id );
	}

	return new WP_Error( 'invalid_key', __( 'Invalid key.' ) );
}

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *