hjalali
(Hossein Jalali)
1
非常にシンプルな関数があるのですが、なぜか動作しません。何が間違っているのか、ご教示いただけますでしょうか。
常に「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
simon
2
リクエストヘッダーに Api-Key と Api-Username の値を指定する必要があります。このトピックの末尾には、参考になる curl の例があります:https://meta.discourse.org/t/sync-sso-user-data-with-the-sync-sso-route/84398。
「いいね!」 5
hjalali
(Hossein Jalali)
3
どうもありがとう!これで解決しました。
同じ問題を抱えている他の人のために:
$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
hjalali
(Hossein Jalali)
4
追加ですが、“user_field” を更新する必要がある場合は、$data を以下に置き換えてください:
$data = ['user_fields' => ['1' => 'Something']];
ここで数字の「1」は、最初に作成した user_field の番号です(名前でなく番号で割り当てられます)。
「いいね!」 2
brospars
(Benoit Rospars)
5
いつから必須になったのですか?
変更履歴には見つかりませんでした。2〜3年前にバッチでカテゴリを作成するツールを作成しましたが、それまでは問題なく動作していたのに、今はこのエラーが表示されます…
blake
(Blake Erickson)
6
ご迷惑をおかけして申し訳ありません。この変更については段階的に導入し、可能な限り通知を行いましたが、すべての非推奨利用ケースを把握するのは困難でした。
「いいね!」 2