"BAD CSRF" al ejecutar PUT usando API, curl y PHP

Tengo una función muy simple que “debería” funcionar, pero por alguna razón no lo hace. ¿Alguien puede ayudarme a entender qué estamos haciendo mal?

Seguimos obteniendo el error “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;
  }

}

Por cierto, ya intenté mover la api_key y la api_username a la URL anterior como GET, pero no hubo diferencia.

1 me gusta

Necesitas incluir los valores de Api-Key y Api-Username en el encabezado de la solicitud. Hay un ejemplo con curl al final de este tema que podría ser útil: Sync DiscourseConnect user data with the sync_sso route.

5 Me gusta

¡Muchas gracias! Eso funcionó.

Para cualquier otra persona con el mismo 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) {
   // Manejar el error, llamar a curl_close($ch) y retornar.
}

curl_close($ch);

$discourse_user = json_decode($result);
4 Me gusta

Solo para añadir a eso, si alguien necesita actualizar un “user_field”, reemplace $data con esto:

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

El número “1” corresponde al primer user_field que creé (ya que se asignan por número, no por nombre).

2 Me gusta

¿Desde cuándo es obligatorio?
No lo encontré en el registro de cambios. Creé una herramienta hace 2-3 años para crear categorías por lotes que funcionaba perfectamente y ahora me sale este error…

Disculpa cualquier problema que esto haya causado. Implementamos esta modificación de forma gradual y notificamos a los usuarios lo mejor que pudimos, pero es difícil detectar todos los casos de uso obsoletos.

2 Me gusta