web-dev-qa-db-ja.com

ノンスを確認 REST API?

REST AP​​Iのnonce検証に関するベストプラクティスを理解したいと思います。

RESTリクエストのためにwp_rest nonceについて話している人がたくさんいます。しかし、WordPressのコアコードを見てみると、wp_restはログインしているユーザーのステータスを検証するための単なる一例にすぎないことがわかりました。

とは言っても、POST要求をREST AP​​Iに送信するときに2つのナンスを送信する必要がありますか。認証wp_rest用とアクションfoo_action用です。

もしそうなら、どのように私はJavaScriptでwp_restfoo_action nonceを送るべきです、そして、PHPでは、それらのnonceを検証するための正しい場所は何ですか? (私は引数のためのvalidate_callbackを意味しますか?permission_callback?)

2

私は自分のテストに基づいて私自身の質問に答えています。それは私がグーグルを見つけることができなかった何かであるので私がこれを尋ねたので、私はここに解決策を投稿したいと思いました。

最初にしたことは、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_noncewp_restの2つのノンスを渡しています。 WordPressはログインユーザーからのREST AP​​I要求ごとに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');
            }
        ]
    ]
]);

それでおしまい!

2