Функция WP_AUTHENTICATE_APPLICATION_PASSWORD() в WordPress 5.6.0

WP_AUTHENTICATE_APPLICATION_PASSWORD() │ WP 5.6.0

Эта функция позволяет аутентифицировать пользователя с помощью пароля приложения.

Использует

Функция WP_Application_Passwords::get_user_application_passwords() возвращает пароли приложения пользователя.

События (HOOKS)

Функция запускает несколько событии при аутентификации:

  • application_password_is_api_request
  • application_password_failed_authentication
  • wp_authenticate_application_password_errors
  • application_password_did_authenticate

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

Функция может вернуть:

  • WP_User — если аутентификация успешна,
  • WP_Error — если произошла ошибка,
  • null — если не передан пользователь и это не API-запрос.

Использование

Функция вызывается следующим образом:

wp_authenticate_application_password( $input_user, $username, $password );

Параметры:

  • $input_user (обязательный) — Объект WP_User или WP_Error, если аутентификация по предыдущему запросу не удалась.
  • $username (обязательный) — Имя пользователя, которое необходимо для аутентификации.
  • $password (обязательный) — Пароль для аутентификации.

Примеры

Пример 1

Эта функция предназначена больше для внутреннего использования ядром WordPress. Рассмотрим пример, где используется эта функция:

function wp_validate_application_password( $input_user ) {
    // Не аутентифицировать дважды.
    if ( ! empty( $input_user ) ) {
        return $input_user;
    }

    if ( ! wp_is_application_passwords_available() ) {
        return $input_user;
    }

    // Проверяем, что мы пытаемся аутентифицироваться.
    if ( ! isset( $_SERVER['PHP_AUTH_USER'] ) ) {
        return $input_user;
    }

    $authenticated = wp_authenticate_application_password( null, $_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'] );

    if ( $authenticated instanceof WP_User ) {
        return $authenticated->ID;
    }

    // Если не пользователь был возвращён, просто возвращаем значение, которое мы получили изначал��но.
    return $input_user;
}

Изменения

Функция была представлена в версии 5.6.0.

Внутренняя реализация

Вот как выглядит реализация функции в WordPress:

function wp_authenticate_application_password( $input_user, $username, $password ) {
    if ( $input_user instanceof WP_User ) {
        return $input_user;
    }

    if ( ! WP_Application_Passwords::is_in_use() ) {
        return $input_user;
    }

    $is_api_request = ( ( defined( 'XMLRPC_REQUEST' ) && XMLRPC_REQUEST ) || ( defined( 'REST_REQUEST' ) && REST_REQUEST ) );

    $is_api_request = apply_filters( 'application_password_is_api_request', $is_api_request );

    if ( ! $is_api_request ) {
        return $input_user;
    }

    $error = null;
    $user  = get_user_by( 'login', $username );

    if ( ! $user && is_email( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    if ( ! $user ) {
        if ( is_email( $username ) ) {
            $error = new WP_Error(
                'invalid_email',
                __( 'Ошибка: Неизвестный адрес электронной почты. Проверьте еще раз или попробуйте ваше имя пользователя.' )
            );
        } else {
            $error = new WP_Error(
                'invalid_username',
                __( 'Ошибка: Неизвестное имя пользователя. Проверьте еще раз или попробуйте ваш адрес электронной почты.' )
            );
        }
    } elseif ( ! wp_is_application_passwords_available() ) {
        $error = new WP_Error(
            'application_passwords_disabled',
            __( 'Пароли приложений недоступны.' )
        );
    } elseif ( ! wp_is_application_passwords_available_for_user( $user ) ) {
        $error = new WP_Error(
            'application_passwords_disabled_for_user',
            __( 'Пароли приложений недоступны для вашей учётной записи. Пожалуйста, свяжитесь с администратором сайта для получения помощи.' )
        );
    }

    if ( $error ) {
        do_action( 'application_password_failed_authentication', $error );
        return $error;
    }

    $password = preg_replace( '/[^a-zd]/i', '', $password );

    $hashed_passwords = WP_Application_Passwords::get_user_application_passwords( $user->ID );

    foreach ( $hashed_passwords as $key => $item ) {
        if ( ! wp_check_password( $password, $item['password'], $user->ID ) ) {
            continue;
        }

        $error = new WP_Error();

        do_action( 'wp_authenticate_application_password_errors', $error, $user, $item, $password );

        if ( is_wp_error( $error ) && $error->has_errors() ) {
            do_action( 'application_password_failed_authentication', $error );
            return $error;
        }

        WP_Application_Passwords::record_application_password_usage( $user->ID, $item['uuid'] );

        do_action( 'application_password_did_authenticate', $user, $item );

        return $user;
    }

    $error = new WP_Error(
        'incorrect_password',
        __( 'Предоставленный пароль является неверным паролем приложения.' )
    );

    do_action( 'application_password_failed_authentication', $error );
    return $error;
}

Связанные функции

  • wp_is_application_passwords_available() — Проверяет, доступны ли пароли приложений.
  • Внутренние функции REST API: get_rest_url(), register_rest_field(), register_rest_route(), и другие.

Эта статья поможет вам понять, как использовать функцию аутентификации паролей приложений в WordPress и повысить безопасность вашего сайта.

Leave a Reply

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