"BAD CSRF" ao executar PUT usando API, curl e PHP

Tenho uma função muito simples que “deveria” funcionar, mas por algum motivo não está. Alguém pode me ajudar a entender o que estamos fazendo de errado?

Continuamos recebendo o erro “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;
  }

}

A propósito, já tentei mover o api_key e o api_username para a URL acima como GET, mas não fez diferença.

Você precisa incluir os valores Api-Key e Api-Username no cabeçalho da solicitação. Há um exemplo em curl próximo ao final deste tópico que pode ser útil: Sync DiscourseConnect user data with the sync_sso route.

Muito obrigado! Isso resolveu o problema.

Para qualquer outra pessoa com o mesmo problema:

$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) {
   // Trate o erro, chame curl_close($ch) e retorne.
}

curl_close($ch);

$discourse_user = json_decode($result);

Apenas para complementar, se alguém precisar atualizar um “user_field”, substitua o $data por este:

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

O número “1” refere-se ao primeiro user_field que criei (pois eles são atribuídos por número, não por nome).

Desde quando isso é obrigatório?
Não encontrei nada no changelog. Criei uma ferramenta há 2 ou 3 anos para criar categorias em lote que funcionava perfeitamente e agora estou recebendo esse erro…

Pedimos desculpas por quaisquer problemas causados. Realizamos uma implementação gradual dessa alteração e notificamos as pessoas da melhor forma possível, mas é difícil identificar todos os casos de uso de depreciação.