WP_AUTHENTICATE_APPLICATION_PASSWORD() │ WP 5.6.0
Эта функция позволяет аутентифицировать пользователя с помощью пароля приложения.
Использует
Функция WP_Application_Passwords::get_user_application_passwords() возвращает пароли приложения пользователя.
События (HOOKS)
Функция запускает несколько событии при аутентификации:
application_password_is_api_requestapplication_password_failed_authenticationwp_authenticate_application_password_errorsapplication_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 и повысить безопасность вашего сайта.