REST APIのnonce検証に関するベストプラクティスを理解したいと思います。
RESTリクエストのためにwp_rest
nonceについて話している人がたくさんいます。しかし、WordPressのコアコードを見てみると、wp_rest
はログインしているユーザーのステータスを検証するための単なる一例にすぎないことがわかりました。
とは言っても、POST要求をREST APIに送信するときに2つのナンスを送信する必要がありますか。認証wp_rest
用とアクションfoo_action
用です。
もしそうなら、どのように私はJavaScriptでwp_rest
とfoo_action
nonceを送るべきです、そして、PHPでは、それらのnonceを検証するための正しい場所は何ですか? (私は引数のためのvalidate_callbackを意味しますか?permission_callback?)
私は自分のテストに基づいて私自身の質問に答えています。それは私がグーグルを見つけることができなかった何かであるので私がこれを尋ねたので、私はここに解決策を投稿したいと思いました。
最初にしたことは、PHPからJavaScriptにデータを渡すために、wp_localize_script
関数を使用してJavaScriptをエンキューすることでした。
wp_register_script('foo', 'foo.js');
wp_localize_script('foo', 'fooData', [
'endpoint' => esc_url_raw(rest_url('/foo/v1')),
'nonces' => [
'foo_nonce' => wp_create_nonce('foo_nonce'),
'wp_rest' => wp_create_nonce('wp_rest')
]
]);
wp_enqueue_script('foo');
foo_nonce
とwp_rest
の2つのノンスを渡しています。 WordPressはログインユーザーからのREST API要求ごとにwp_rest
nonceを内部的にチェックします。 (That check is in wp-includes\rest-api.php @ 810 - WordPress 5.0.2)
。その一回だけが存在していないなら、要求はまるでそれがゲストユーザであるかのように扱われます。
さて、JavaScriptでは、FooData
オブジェクトのPHPからデータを受け取ります。
$.ajax({
url: FooData.endpoint + '/addSomething',
type: "POST",
dataType: "json",
data: {
// Your other data here
"foo_nonce": FooData.nonces.foo_nonce
},
// This nonce is verified automatically by WordPress for logged-in users
beforeSend: function (xhr) {
xhr.setRequestHeader('X-WP-Nonce', FooData.nonces.wp_rest);
}
});
リクエストがサーバーに送信されたら、nonceフィールドのwp_verify_nonce
に対してvalidate_callback
を実行できます。
register_rest_route('foo/v1', '/doSomething', [
'methods' => WP_REST_Server::CREATABLE,
'callback' => [$this, 'doSomething'],
'args' => [
// Your other data here
'foo_nonce' => [
'validate_callback' => function($foo_nonce) {
return wp_verify_nonce($foo_nonce, 'foo_nonce');
}
]
]
]);
それでおしまい!