В чем суть задачи: авторизация через REST API в WooCommerce
WooCommerce базируется на WordPress, и стандартный REST API WordPress не содержит готового метода для авторизации пользователей. При разработке мобильных приложений, SPA или интеграций часто возникает необходимость авторизовать пользователя и получить токен для дальнейших запросов. В этой статье разберем, как реализовать собственный endpoint REST API для авторизации пользователя WooCommerce с возвращением JWT токена.
Диагностика проблемы: почему стандартный REST API не подходит
WordPress REST API по умолчанию позволяет получать данные, создавать записи, но не содержит метода для входа пользователя и получения токена аутентификации. WooCommerce расширяет API товарами и заказами, но не содержит механизма авторизации по API. Без собственной реализации невозможно безопасно аутентифицировать пользователя по логину и паролю через API.
Что происходит при попытке авторизоваться стандартными методами
- Попытка передать логин и пароль в теле запроса к /wp-json/wp/v2/users приводит к ошибке 401 Unauthorized.
- Использование Basic Auth требует передачи пароля в каждом запросе, что небезопасно.
- OAuth и cookie аутентификация работают только для браузерных сессий, не подходят для внешних приложений.
Пошаговое решение: создание REST API для авторизации с JWT
Шаг 1. Установка и настройка JWT Authentication for WP REST API
Самый популярный способ — использовать плагин JWT Authentication for WP REST API. После установки и активации добавьте в wp-config.php секретный ключ:
define('JWT_AUTH_SECRET_KEY', 'ваш_сложный_секретный_ключ_не_меньше_32_символов');Обязательно выберите длинный и случайный ключ.
Шаг 2. Создание собственного REST endpoint для логина
Добавим кастомный endpoint, который будет принимать логин и пароль, и возвращать JWT токен:
add_action('rest_api_init', function () {
register_rest_route('custom/v1', '/login', [
'methods' => 'POST',
'callback' => 'custom_api_user_login',
'permission_callback' => '__return_true',
]);
});
function custom_api_user_login(WP_REST_Request $request) {
$username = $request->get_param('username');
$password = $request->get_param('password');
if (empty($username) || empty($password)) {
return new WP_Error('missing_data', 'Username or password is missing', ['status' => 400]);
}
$user = wp_authenticate($username, $password);
if (is_wp_error($user)) {
return new WP_Error('invalid_credentials', 'Invalid username or password', ['status' => 403]);
}
// Генерируем JWT токен
$token = generate_jwt_token($user->ID);
return [
'token' => $token,
'user_id' => $user->ID,
'username' => $user->user_login
];
}
function generate_jwt_token($user_id) {
$issued_at = time();
$expiration = $issued_at + (DAY_IN_SECONDS * 7); // токен валиден 7 дней
$payload = [
'iat' => $issued_at,
'exp' => $expiration,
'data' => ['user_id' => $user_id],
];
$secret_key = defined('JWT_AUTH_SECRET_KEY') ? JWT_AUTH_SECRET_KEY : 'default_secret';
return JWT::encode($payload, $secret_key);
}В этом примере функция generate_jwt_token использует библиотеку JWT (например, firebase/php-jwt), которую нужно подключить через composer или вручную.
Шаг 3. Проверка токена при последующих запросах
Чтобы защитить другие REST API методы, необходимо настроить проверку JWT токена в заголовке Authorization: Bearer {token}. Плагин JWT Authentication for WP REST API автоматически реализует такую проверку, если активирован и настроен.
Проверка результата после внедрения
1. Отправьте POST-запрос к /wp-json/custom/v1/login с JSON телом:
{
"username": "user",
"password": "password"
}2. Если данные верны, получите ответ с токеном:
{
"token": "eyJ0eXAiOiJKV1QiLCJh...",
"user_id": 123,
"username": "user"
}3. Для теста вызовите защищенный метод с заголовком:
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJh...Если все настроено правильно, запрос будет успешно выполнен.
Частые ошибки и как их исправить
- Ошибка 403 при логине: проверьте правильность логина и пароля, а также что функция
wp_authenticateвызывается корректно. - JWT токен не генерируется: убедитесь, что вы подключили библиотеку JWT и правильно задаете секретный ключ в
wp-config.php. - Плагин JWT Authentication не активирован или не настроен: без него плагин не сможет валидировать токен в последующих запросах.
- Проблемы с CORS: если делаете запросы из браузера, настройте правильные CORS заголовки на сервере.
Практические советы по безопасности и производительности
- Используйте HTTPS для всех API запросов, чтобы защитить логин и пароль.
- Не храните токен слишком долго, используйте разумный срок жизни (7 дней или меньше).
- Храните секретный ключ вне публичного доступа и регулярно обновляйте его при подозрениях на компрометацию.
- Ограничьте количество попыток входа через API, чтобы избежать brute force атак.
- Для WooCommerce API используйте отдельные ключи и права доступа, не передавайте учетные данные администратора.
Сравнение вариантов реализации авторизации через REST API
| Вариант | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин JWT Authentication | Использование готового плагина для генерации и проверки JWT токенов | Быстрая интеграция, поддержка токенов, безопасность | Зависимость от стороннего плагина, настройка секретного ключа |
| Basic Auth | Передача логина и пароля в каждом запросе | Простота реализации | Низкая безопасность, требует HTTPS |
| OAuth 1.0a WooCommerce | Стандартная авторизация WooCommerce REST API через OAuth | Безопасно, официально поддерживается | Сложность настройки, менее удобно для мобильных клиентов |