API、curl、PHP を使用した PUT 実行時に「BAD CSRF」エラーが発生

非常にシンプルな関数があるのですが、なぜか動作しません。何が間違っているのか、ご教示いただけますでしょうか。

常に「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 パラメータとして移動させることも試みましたが、結果は変わりませんでした。

「いいね!」 1

リクエストヘッダーに Api-KeyApi-Username の値を指定する必要があります。このトピックの末尾には、参考になる curl の例があります:https://meta.discourse.org/t/sync-sso-user-data-with-the-sync-sso-route/84398。

「いいね!」 5

どうもありがとう!これで解決しました。

同じ問題を抱えている他の人のために:

$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 );
「いいね!」 4

追加ですが、“user_field” を更新する必要がある場合は、$data を以下に置き換えてください:

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

ここで数字の「1」は、最初に作成した user_field の番号です(名前でなく番号で割り当てられます)。

「いいね!」 2

いつから必須になったのですか?
変更履歴には見つかりませんでした。2〜3年前にバッチでカテゴリを作成するツールを作成しましたが、それまでは問題なく動作していたのに、今はこのエラーが表示されます…

ご迷惑をおかけして申し訳ありません。この変更については段階的に導入し、可能な限り通知を行いましたが、すべての非推奨利用ケースを把握するのは困難でした。

「いいね!」 2