"FAIBLE CSRF" lors de l'exécution de PUT avec API, curl et PHP

J’ai une fonction très simple qui “devrait” fonctionner, mais pour une raison quelconque, ce n’est pas le cas. Quelqu’un peut-il m’aider à comprendre ce que nous faisons de travers.

Nous continuons à recevoir l’erreur « 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;
  }

}

Au fait, j’ai déjà essayé de déplacer api_key et api_username dans l’URL ci-dessus en GET, mais cela ne fait aucune différence.

1 « J'aime »

Vous devez inclure les valeurs Api-Key et Api-Username dans l’en-tête de la requête. Un exemple avec curl se trouve vers la fin de ce sujet et pourrait vous être utile : Sync DiscourseConnect user data with the sync_sso route.

5 « J'aime »

Merci beaucoup ! Cela a fait l’affaire.

Pour toute autre personne ayant le même problème :

$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 ) {
   // Gérer l'erreur, appeler curl_close( $ch ) et retourner.
}

curl_close( $ch );

$discourse_user = json_decode( $result );
4 « J'aime »

Pour compléter cela, si quelqu’un doit mettre à jour un “user_field”, remplacez $data par ceci :

$data = ['user_fields' => ['1' => 'Quelque chose']];

Le chiffre “1” correspond au premier user_field que j’ai créé (car ils sont attribués par numéro et non par nom).

2 « J'aime »

Depuis quand est-ce obligatoire ?
Je ne l’ai pas trouvé dans le journal des modifications. J’ai créé un outil il y a 2 ou 3 ans pour créer des catégories par lots, qui fonctionnait parfaitement, et maintenant j’obtiens cette erreur…

Nous sommes désolés pour les problèmes que cela a pu causer. Nous avons procédé à une mise en œuvre progressive de ce changement et avons informé les utilisateurs du mieux possible, mais il est difficile de repérer chaque cas d’utilisation déprécié.

2 « J'aime »