Фильтр WordPress: wp_authenticate_user не получает данные пользователя - PullRequest
0 голосов
/ 27 января 2019

Для настройки WordPress + WooCommerce я пытаюсь реализовать активацию электронной почты и функцию Google Captcha при входе в систему с использованием фильтра wp_authenticate_user, но порядок проверки неверен.

Хорошо, сценарий

  1. Пустое имя пользователя и пароль без подтверждения Captcha> получите правильную ошибку, сказав пароль пуст .

  2. Неправильное имя пользователя без пароля и контрольной отправки> правильное сообщение об ошибке с указанием неверное имя пользователя или пароль .

  3. Допустимое имя пользователя с неверным паролем с отправкой Captcha> неверное имя пользователя или пароль

Плохой сценарий

  1. действительное имя пользователя с неверным паролем без отправки капчи> Ошибка капчи (ожидается неверное имя пользователя или пароль).

Как я могу изменить это, чтобы проверить Captcha после проверки имени пользователя и пароля?

Примечание:

Если я переключу проверку, активированную по электронной почте, чтобы она имела больший приоритет, я получаю эту ошибку в плохом сценарии.

Контрольный код

function display_login_captcha() { ?>
    <div class="g-recaptcha" data-sitekey="<?php echo get_option('captcha_site_key'); ?>"></div>
<?php }
add_action( "login_form", "display_login_captcha" );

function verify_login_captcha($user,$password) {
    if (isset($_POST['g-recaptcha-response'])) {
        $recaptcha_secret = get_option('captcha_secret_key');
        $response = wp_remote_get("https://www.google.com/recaptcha/api/siteverify?secret=". $recaptcha_secret ."&response=". $_POST['g-recaptcha-response']);
        $response = json_decode($response["body"], true);
        if (true == $response["success"]) {
            return $user;
        } else {
            return new WP_Error("Captcha Invalid", __(" Only 3 attemps allowed,  Are you Human? Please validate yourself"));
        }
    } else {
        return new WP_Error("Captcha Invalid", __(" Only 3 attemps allowed, It seems like we are having hard time identifying you as a human! If you are then enable JavaScript"));
    }
}
add_filter("wp_authenticate_user", "verify_login_captcha", 10, 2);

Проверка активации

function custom_authenticate_user($userdata) {
    $isActivated = get_user_meta($userdata->ID, 'is_activated', true);
    if (!$isActivated) {
        $userdata = new WP_Error(
                            'inkfool_confirmation_error',
                            __( '<strong>ERROR:</strong> 111 <'.$userdata->id.'>Your account has to be activated before you can login. You can resend by clicking <a href="/sign-in/?u='.$userdata->ID.'">here</a>', 'inkfool' )
                        );
    }
    return $userdata;
}
add_filter('wp_authenticate_user', 'custom_authenticate_user',11,1);

1 Ответ

0 голосов
/ 28 января 2019

Функция, которая проверяет имя пользователя / адрес электронной почты, подключается к фильтру autenticate с приоритетом 20. И хуки добавляются через wp-includes/default-filters.php, как вы можете видеть ниже:

// Default authentication filters
add_filter( 'authenticate', 'wp_authenticate_username_password',  20, 3 );
add_filter( 'authenticate', 'wp_authenticate_email_password',     20, 3 );

Таким образом, если вы хотите, чтобы ваши пользовательские функции проверки запускались после этих проверок по умолчанию, вам следует вместо этого подключиться к фильтру authenticate и использовать 20 (или более высокое значение - 21, 30 и т. Д.) В качестве приоритета:

add_filter( 'authenticate', 'verify_login_captcha', 21, 3 );
add_filter( 'authenticate', 'custom_authenticate_user', 21 );

И измените объявление функции таким образом, чтобы первый параметр был NULL или WP_User экземпляр в случае успеха:

function verify_login_captcha( $user, $username, $password ) {
  ...your validation...

  return $user; // You should return the WP_User instance or a WP_Error instance on error.
}

function custom_authenticate_user( $user ) {
  ...your validation...

  return $user; // You should return the WP_User instance or a WP_Error instance on error.
}

PS: Обязательно проверьте, является ли $user допустимым пользовательским объектом, прежде чем обращаться к его свойствам и методам. См. здесь для получения более подробной информации. Например ::1030*

function custom_authenticate_user( $user ) {
  if ( ! $user ) {
    return $user;
  }

  ...
}
...