"BAD CSRF" durante l'esecuzione di PUT usando API, curl e PHP

Ho una funzione molto semplice che “dovrebbe” funzionare, ma per qualche motivo non lo fa. Qualcuno può aiutarmi a capire cosa stiamo sbagliando?

Continuiamo a ricevere l’errore “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 proposito, ho già provato a spostare api_key e api_username nell’URL sopra come GET, ma non cambia nulla.

Devi inserire i valori Api-Key e Api-Username nell’intestazione della richiesta. C’è un esempio curl verso la fine di questo argomento che potrebbe essere utile: Sync DiscourseConnect user data with the sync_sso route.

Grazie mille! Ha funzionato.

Per chiunque altro abbia lo stesso 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) {
   // Gestisci l'errore, chiama curl_close($ch) e ritorna.
}

curl_close($ch);

$discourse_user = json_decode($result);

Per aggiungere qualcosa a quanto detto, se qualcuno deve aggiornare un “user_field”, sostituisci $data con questo:

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

Il numero “1” corrisponde al primo user_field che ho creato (poiché vengono assegnati per numero e non per nome).

Da quando è obbligatorio?
Non l’ho trovato nel changelog. Ho creato uno strumento 2-3 anni fa per creare categorie in batch che funzionava perfettamente e ora ricevo questo errore…

Ci scusiamo per eventuali problemi causati; abbiamo implementato questa modifica in modo graduale e abbiamo avvisato gli utenti nel modo migliore possibile, ma è difficile intercettare ogni caso di deprecazione.