"BAD CSRF" при выполнении PUT через API, curl и PHP

У меня есть очень простая функция, которая «должна» работать, но по какой-то причине не работает. Кто-нибудь может помочь мне понять, что мы делаем не так?

Мы постоянно получаем ошибку «BAD CSRF».

public function changeName()
{
  $url = 'https://www.website.com/{username}.json';
  $data = ['name' => 'James', 'api_key' => DISCOURSE_API, 'api_username' => 'system'];

  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
  curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type:multipart/form-data'));
  curl_setopt($ch, CURLOPT_POSTFIELDS,http_build_query($data));

  echo $response = curl_exec($ch);

  if (!$response)
  {
      return false;
  }

}

Кстати, я уже пробовал перенести api_key и api_username в URL выше как GET-параметры, но это не помогло.

Вам необходимо указать значения Api-Key и Api-Username в заголовке запроса. В конце этой темы приведён пример с использованием curl, который может оказаться полезным: Sync DiscourseConnect user data with the sync_sso route.

Спасибо большое! Это помогло.

Для всех остальных с той же проблемой:

$url = 'https://www.website.com/{username}.json';
$data = ['name' => 'George'];
$api_key = CUSTOM_DISCOURSE_API;

$headers = array("Content-Type: multipart/form-data;", "Api-Key: $api_key", "Api-Username: system");


$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers );
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));

$result = curl_exec( $ch );

if ( curl_errno( $ch ) !== 0 ) {
   // Обработайте ошибку, вызовите curl_close( $ch ) и вернитесь.
}

curl_close( $ch );

$discourse_user = json_decode( $result );

В дополнение к этому, если кому-то нужно обновить «user_field», замените $data следующим образом:

$data = ['user_fields' => ['1' => 'Something'];

Цифра «1» — это первый созданный user_field (так как они назначаются по номеру, а не по имени).

С какого момента это стало обязательным?
В списке изменений этого не нашёл. Я создал инструмент 2–3 года назад для массового создания категорий, и он работал отлично, а теперь получаю эту ошибку…

Приносим извинения за любые возникшие проблемы. Мы проводили постепенный переход на это изменение и уведомили пользователей насколько это было возможно, однако сложно отследить все случаи использования устаревших методов.