В современных проектах на WordPress часто возникает необходимость обеспечить авторизацию пользователей через REST API с использованием токенов. Это особенно актуально для сайтов, работающих в приватных сетях или внутренних корпоративных порталах, где важно не только удобство, но и безопасность доступа. В этой статье мы разберём, как реализовать такую авторизацию своими силами, без привлечения сторонних сервисов, с примерами кода и рекомендациями.
Что такое авторизация через REST API и зачем она нужна
REST API в WordPress — мощный инструмент для взаимодействия с сайтом через HTTP-запросы. С его помощью можно создавать мобильные приложения, интегрировать внешние сервисы или строить SPA (Single Page Application). Однако по умолчанию REST API защищён лишь базовыми методами аутентификации, которые не всегда подходят для приватных сетей и специфичных сценариев.
Авторизация через токены позволяет безопасно подтверждать личность пользователя при каждом запросе без необходимости отправлять логин и пароль каждый раз. Это снижает риски и упрощает управление сессиями.
Особенности авторизации через REST API в приватной сети
Приватная сеть накладывает свои требования:
- Ограниченный доступ к API — только изнутри сети.
- Минимизация внешних зависимостей и сервисов.
- Высокий уровень контроля над процессом аутентификации.
- Возможность интеграции с внутренними системами безопасности.
В таких условиях оптимально создать собственный механизм авторизации через REST API с использованием токенов, которые генерируются и проверяются сервером WordPress.
Создание кастомного REST API эндпоинта для авторизации с токеном
Начнём с регистрации собственного маршрута для авторизации. Он будет принимать логин и пароль, проверять их и возвращать токен, который можно использовать для последующих запросов.
add_action('rest_api_init', function () {
register_rest_route('wpauth/v1', '/login', [
'methods' => 'POST',
'callback' => 'wpauth_rest_authenticate_user',
'permission_callback' => '__return_true',
]);
});
function wpauth_rest_authenticate_user(WP_REST_Request $request) {
$params = $request->get_json_params();
$username = sanitize_text_field($params['username'] ?? '');
$password = sanitize_text_field($params['password'] ?? '');
if (empty($username) || empty($password)) {
return new WP_REST_Response(['error' => 'Необходимо указать логин и пароль'], 400);
}
$user = wp_authenticate($username, $password);
if (is_wp_error($user)) {
return new WP_REST_Response(['error' => 'Неверный логин или пароль'], 401);
}
$token = wpauth_generate_token_for_user($user->ID);
return [
'token' => $token,
'user_id' => $user->ID,
'user_email' => $user->user_email,
];
}
function wpauth_generate_token_for_user($user_id) {
$token = bin2hex(random_bytes(32));
update_user_meta($user_id, '_wpauth_api_token', $token);
return $token;
}
В этом коде мы создали эндпоинт /wp-json/wpauth/v1/login, который принимает POST-запрос с JSON-данными username и password. После успешной аутентификации генерируется уникальный токен и сохраняется в мета пользователя.
Валидация токена при обращении к другим REST API маршрутам
Чтобы использовать токен для авторизации других запросов, нужно реализовать проверку токена в заголовке Authorization. Для этого создадим функцию верификации и применим её для защиты маршрутов.
function wpauth_rest_check_token(WP_REST_Request $request) {
$auth_header = $request->get_header('authorization');
if (!$auth_header) {
return new WP_Error('no_token', 'Отсутствует токен авторизации', ['status' => 401]);
}
if (strpos($auth_header, 'Bearer ') !== 0) {
return new WP_Error('invalid_token_format', 'Неверный формат токена', ['status' => 401]);
}
$token = substr($auth_header, 7);
$users = get_users(['meta_key' => '_wpauth_api_token', 'meta_value' => $token]);
if (empty($users)) {
return new WP_Error('invalid_token', 'Неверный или просроченный токен', ['status' => 401]);
}
return true;
}
add_action('rest_api_init', function () {
register_rest_route('wpauth/v1', '/secure-data', [
'methods' => 'GET',
'callback' => function() {
return ['data' => 'Секретная информация доступна только авторизованным пользователям'];
},
'permission_callback' => 'wpauth_rest_check_token',
]);
});
Теперь все запросы к /wp-json/wpauth/v1/secure-data должны содержать заголовок Authorization: Bearer <токен>. Без валидного токена доступ будет запрещён.
Практические рекомендации по безопасности токенов
Для повышения надёжности и безопасности авторизации стоит учесть следующие моменты:
- Истечение срока действия токена. Добавьте время хранения токена и проверяйте его актуальность, чтобы избежать вечных токенов.
- Хэширование токена. Вместо хранить токен в базе в открытом виде, храните его хэш, а для проверки сравнивайте хэш полученного токена.
- Обновление и отзыв токенов. Реализуйте возможность деактивации токена пользователем или администратором.
- Использование HTTPS. Всегда используйте защищённое соединение для передачи токенов.
- Ограничение прав. Минимизируйте права пользователя, работающего через токен, особенно если это API токен для сервисов.
Пример расширения с истечением срока действия токена
function wpauth_generate_token_for_user($user_id) {
$token = bin2hex(random_bytes(32));
$expire = time() + DAY_IN_SECONDS; // токен действует 24 часа
update_user_meta($user_id, '_wpauth_api_token', $token);
update_user_meta($user_id, '_wpauth_api_token_expire', $expire);
return $token;
}
function wpauth_rest_check_token(WP_REST_Request $request) {
$auth_header = $request->get_header('authorization');
if (!$auth_header) {
return new WP_Error('no_token', 'Отсутствует токен авторизации', ['status' => 401]);
}
if (strpos($auth_header, 'Bearer ') !== 0) {
return new WP_Error('invalid_token_format', 'Неверный формат токена', ['status' => 401]);
}
$token = substr($auth_header, 7);
$users = get_users(['meta_key' => '_wpauth_api_token', 'meta_value' => $token]);
if (empty($users)) {
return new WP_Error('invalid_token', 'Неверный или просроченный токен', ['status' => 401]);
}
$user = $users[0];
$expire = (int) get_user_meta($user->ID, '_wpauth_api_token_expire', true);
if ($expire < time()) {
return new WP_Error('token_expired', 'Токен истёк', ['status' => 401]);
}
return true;
}
Использование готовых плагинов для расширения функционала авторизации
Если вы хотите упростить процесс и использовать готовое решение, обратите внимание на плагины с поддержкой авторизации через REST API и JWT-токенов. Например:
- JWT Authentication for WP REST API — позволяет реализовать авторизацию через JWT с минимальной настройкой.
- Clearfy Pro — содержит модули безопасности, которые можно использовать для усиления защиты авторизации.
Однако при использовании плагинов важно внимательно изучать документацию и оценивать соответствие требованиям приватной сети.
Заключение
Реализация авторизации через REST API с токеном в WordPress для приватной сети — задача вполне выполнимая с помощью кастомных эндпоинтов и простых функций. Такой подход даёт полный контроль над процессом и позволяет гибко настраивать безопасность и логику работы. В дополнение к этому можно использовать уже готовые решения, если они подходят под ваши требования.
Используйте данный подход, чтобы создать удобный, безопасный и адаптированный под ваш проект механизм авторизации через REST API.