使用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 作为 GET 参数移动到上面的 URL 中,但没有区别。

您需要在请求头中放入 Api-KeyApi-Username 的值。本主题末尾有一个 curl 示例,可能会对您有所帮助:https://meta.discourse.org/t/sync-sso-user-data-with-the-sync-sso-route/84398。

非常感谢!问题解决了。

对于其他遇到同样问题的人:

$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(因为它们是按数字而非名称分配的)。

从什么时候开始强制要求的?
在变更日志中没找到。我两年前创建了一个批量创建类别的工具,当时运行完美,但现在却出现了这个错误……

对此造成的任何问题我们深表歉意。我们已对此变更进行了缓慢的逐步推行,并尽最大努力通知了相关人员,但很难涵盖所有弃用场景。