WP REST API: отправка файлов и изображений с поддержкой авторизации

Работа с файлами и изображениями через WP REST API — одна из востребованных задач при интеграции WordPress с внешними сервисами и мобильными приложениями. В этой статье разберем, как корректно отправлять файлы (например, изображения) на сервер через REST API, учитывая требования по авторизации и безопасности. Также приведем примеры кода для реализации такого функционала.

Особенности отправки файлов через WP REST API

Стандартные REST API эндпоинты WordPress поддерживают загрузку медиафайлов через метод POST на endpoint /wp/v2/media. Однако, чтобы отправка прошла успешно, необходимо учитывать несколько важных моментов:

  • Правильный Content-Type в запросе: для отправки файлов обычно используется multipart/form-data.
  • Обязательная авторизация пользователя с правами на добавление медиа (обычно роль редактор или выше).
  • Обработка ошибок и валидация файлов на стороне сервера.

Без этих условий запросы будут отклонены или обработаны некорректно.

Типы авторизации в WP REST API

Для авторизации при загрузке рекомендуется использовать один из следующих способов:

  • Basic Auth — простая авторизация по логину и паролю. Подходит для разработки, но не рекомендуется для продакшена.
  • OAuth 2.0 — более безопасный способ авторизации, но требует дополнительной настройки.
  • JWT (JSON Web Token) — популярный современный метод, удобный для SPA и мобильных приложений.

Выбор зависит от архитектуры вашего приложения и требований безопасности.

Пример отправки файла через WP REST API с Basic Auth

Рассмотрим пример загрузки изображения на WordPress с использованием Basic Auth и PHP. Для начала убедитесь, что на сервере активирован плагин для Basic Auth, например, WP Basic Auth.

$url = 'https://example.com/wp-json/wp/v2/media';
$username = 'admin';
$password = 'password';

$file_path = '/path/to/image.jpg';
$file_name = basename($file_path);

$file_data = file_get_contents($file_path);

$headers = [
    'Authorization: Basic ' . base64_encode($username . ':' . $password),
    'Content-Disposition: attachment; filename="' . $file_name . '"',
    'Content-Type: image/jpeg'
];

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $file_data);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

if ($http_code === 201) {
    echo "Файл успешно загружен: $response";
} else {
    echo "Ошибка загрузки: $response";
}

Этот пример показывает базовую отправку файла методом POST с нужными заголовками. В ответе вы получите JSON с информацией о загруженном медиафайле.

Обработка ошибок при загрузке

Если загрузка не прошла, API обычно возвращает статус 400 или 401. Для диагностики важно выводить ответ сервера. Например, отсутствие авторизации вернет ошибку:

{
  "code": "rest_cannot_create",
  "message": "Sorry, you are not allowed to create resources.",
  "data": {
    "status": 401
  }
}

Убедитесь, что пользователь аутентифицирован и имеет право создавать медиафайлы.

Отправка файлов через JavaScript с JWT авторизацией

Для современных SPA часто используют JWT-токены. Рассмотрим пример загрузки файла через fetch API с JWT.

async function wpapiSendFile(file) {
  const token = localStorage.getItem('jwt_token'); // Предполагается, что токен уже получен
  const url = 'https://example.com/wp-json/wp/v2/media';

  const formData = new FormData();
  formData.append('file', file);

  const response = await fetch(url, {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer ' + token
    },
    body: formData
  });

  if (response.ok) {
    const data = await response.json();
    console.log('Файл загружен:', data);
  } else {
    const error = await response.json();
    console.error('Ошибка загрузки:', error);
  }
}

Здесь важно не указывать заголовок Content-Type вручную, чтобы браузер сам установил корректный boundary для multipart/form-data.

Получение JWT токена

Для получения JWT токена можно использовать плагин JWT Authentication for WP REST API или аналогичные решения. Запрос на получение токена выглядит так:

POST /wp-json/jwt-auth/v1/token
{
  "username": "admin",
  "password": "password"
}

В ответ придет токен, который нужно сохранить и использовать в заголовках для аутентифицированных запросов.

Безопасность и рекомендации

При работе с загрузкой файлов через REST API важно соблюдать правила безопасности:

  • Проверяйте тип и размер загружаемых файлов на стороне сервера.
  • Используйте защищенные протоколы (HTTPS) для передачи данных.
  • Ограничивайте доступ к эндпоинтам через права пользователей.
  • Рассмотрите возможность внедрения капчи или лимитов на загрузку для предотвращения атак.

Плагины вроде Clearfy Pro помогут улучшить безопасность и оптимизировать работу REST API.

Заключение

Отправка файлов и изображений через WP REST API — задача, которую можно решить с помощью стандартных эндпоинтов и правильной авторизации. Главное — корректно формировать запросы, обрабатывать ошибки и обеспечивать безопасность. Пример кода на PHP и JavaScript поможет быстро интегрировать этот функционал в ваши проекты.

Шаблоны для WP Плагины для WP