hjalali
(Hossein Jalali)
Maio 31, 2020, 10:31pm
1
Tenho uma função muito simples que “deveria” funcionar, mas por algum motivo não está. Alguém pode me ajudar a entender o que estamos fazendo de errado?
Continuamos recebendo o erro “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 propósito, já tentei mover o api_key e o api_username para a URL acima como GET, mas não fez diferença.
simon
Maio 31, 2020, 11:49pm
2
Você precisa incluir os valores Api-Key e Api-Username no cabeçalho da solicitação. Há um exemplo em curl próximo ao final deste tópico que pode ser útil: Sync DiscourseConnect user data with the sync_sso route .
hjalali
(Hossein Jalali)
Junho 1, 2020, 12:16am
3
Muito obrigado! Isso resolveu o problema.
Para qualquer outra pessoa com o mesmo 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) {
// Trate o erro, chame curl_close($ch) e retorne.
}
curl_close($ch);
$discourse_user = json_decode($result);
hjalali
(Hossein Jalali)
Junho 1, 2020, 12:29am
4
Apenas para complementar, se alguém precisar atualizar um “user_field”, substitua o $data por este:
$data = ['user_fields' => ['1' => 'Algo']];
O número “1” refere-se ao primeiro user_field que criei (pois eles são atribuídos por número, não por nome).
brospars
(Benoit Rospars)
Outubro 5, 2021, 9:32am
5
Desde quando isso é obrigatório?
Não encontrei nada no changelog. Criei uma ferramenta há 2 ou 3 anos para criar categorias em lote que funcionava perfeitamente e agora estou recebendo esse erro…
blake
(Blake Erickson)
Outubro 5, 2021, 3:39pm
6
blake:
Aviso de Depreciação!
Em 6 de abril de 2020, removemos o suporte a toda autenticação baseada em cabeçalhos HTTP (exceto algumas rotas de RSS, recebimento de e-mail e ICS). Isso significa que as solicitações de API que possuem api_key e api_username nos parâmetros de consulta ou no corpo HTTP da solicitação deixarão de funcionar em breve.
Pedimos desculpas por quaisquer problemas causados. Realizamos uma implementação gradual dessa alteração e notificamos as pessoas da melhor forma possível, mas é difícil identificar todos os casos de uso de depreciação.