WP REST API Membutuhkan Kata Sandi untuk Mendapatkan Titik Akhir

8

Saya memiliki jenis posting khusus card,, yang saya paparkan melalui WP REST API. Apakah ada cara untuk meminta otentikasi, dengan cookie atau header Auth Basic? Saya melihat argumen di bawah blok metode POST untuk kata sandi, tapi saya tidak yakin bagaimana cara menggunakannya.

masukkan deskripsi gambar di sini

YarGnawh
sumber

Jawaban:

9

Ketika kita mendaftarkan rute istirahat register_rest_route(), maka kita dapat menggunakan permission_callbackparameter dengan jenis izin yang kita inginkan.

Periksa misalnya bagaimana WP_REST_Posts_Controller::register_routes()dan WP_REST_Users_Controller::register_routes()menerapkan panggilan balik izin.

Argumen kata sandi yang Anda maksud adalah kata sandi konten, yang dapat Anda atur untuk setiap posting dan itu tidak sama.

Tetapi karena Anda ingin menargetkan rute yang ada, seperti:

/wp/v2/cards
/wp/v2/cards/(?P<id>[\d]+)
/wp/v2/cards/...possibly some other patterns...

Anda dapat mencoba mis. rest_dispatch_requestfilter untuk mengatur pemeriksaan izin tambahan untuk jenis rute tersebut.

Ini plugin demo:

add_filter( 'rest_dispatch_request', function( $dispatch_result, $request, $route, $hndlr )
{
    $target_base = '/wp/v2/cards';    // Edit to your needs

    $pattern1 = untrailingslashit( $target_base ); // e.g. /wp/v2/cards
    $pattern2 = trailingslashit( $target_base );   // e.g. /wp/v2/cards/

    // Target only /wp/v2/cards and /wp/v2/cards/*
    if( $pattern1 !== $route && $pattern2 !== substr( $route, 0, strlen( $pattern2 ) ) )
        return $dispatch_result;

    // Additional permission check
    if( is_user_logged_in() )  // or e.g. current_user_can( 'manage_options' )
        return $dispatch_result;

    // Target GET method
    if( WP_REST_Server::READABLE !== $request->get_method() ) 
        return $dispatch_result;

    return new \WP_Error( 
        'rest_forbidden', 
        esc_html__( 'Sorry, you are not allowed to do that.', 'wpse' ), 
        [ 'status' => 403 ] 
    );

}, 10, 4 );

tempat kami menargetkan /wp/v2/cardsdan /wp/v2/cards/*MENDAPATKAN rute, dengan pemeriksaan izin pengguna tambahan.

Saat men-debug-nya dengan otentikasi cookie WordPress, kita dapat mis mengujinya langsung dengan:

https://example.tld/wp-json/wp/v2/cards?_wpnonce=9467a0bf9c

dari mana bagian nonce dihasilkan wp_create_nonce( 'wp_rest' );

Semoga ini membantu!

birgire
sumber
Saya mencoba membuatnya umum untuk basis target yang diberikan, tetapi mungkin ada cara yang lebih mudah untuk mengatasi ini? Saya menambahkan contoh kapabilitas sebagai komentar inline @MarkKaplun
birgire
Mungkin lebih mudah untuk menghapus titik akhir untuk jenis posting kustom tertentu, dengan register_post_type_argsfilter dan e, g, ditetapkan $args['show_in_rest'] = is_user_logged_in();untuk jenis posting tertentu atau berdasarkan $args['rest_base']. Tidak yakin apakah itu diinginkan atau direkomendasikan ;-)
birgire
3

Bidang "kata sandi" yang Anda lihat sebenarnya bukan untuk REST API, tetapi untuk entri Pos itu sendiri. Setiap posting di WordPress dapat dilindungi kata sandi sehingga Anda memerlukan kata sandi untuk melihat kontennya.

Bentuk kata sandi individu ini bukan mekanisme kata sandi yang kuat, ini kata sandi bersama. Kata sandinya sama untuk semua pengguna, dan disimpan dalam basis data yang tidak dienkripsi dan tidak diacak. Itu tidak pernah dimaksudkan sebagai mekanisme yang aman dengan cara apa pun, itu adalah mekanisme sederhana untuk menyembunyikan konten dengan cara sederhana.

Jika Anda ingin menggunakan mekanisme ini dengan REST API, maka dimungkinkan. Misalnya, jika ID setiap posting adalah 123, maka sebuah posting dapat diambil seperti:

http://example.com/wp-json/wp/v2/posts/123

Jika posting itu dilindungi kata sandi, maka URL ini akan mengambilnya:

http://example.com/wp-json/wp/v2/posts/123?password=example-pass

Referensi: https://developer.wordpress.org/rest-api/reference/posts/#retrieve-a-post

Jika Anda membutuhkan otentikasi berbasis pengguna yang lebih kuat, maka WordPress menawarkan cara untuk membuat posting "pribadi". Pengaturan ini membuat posting hanya dapat dilihat oleh akun pengguna yang memiliki kemampuan "read_private_posts", yang terbatas pada peran Administrator dan Editor secara default. (Catatan: Pribadi hanya membuat konten tulisan menjadi pribadi, Judul mereka masih dapat diekspos.)

Saat Anda membuat jenis posting khusus, kapabilitas yang sama ini dipetakan ke jamak jenis Anda (menggunakan plural_base). Jadi untuk jenis kartu pos, akan ada izin "read_private_cards" serupa yang tersedia untuk Anda tetapkan ke peran pengguna jika diinginkan.

Sekarang, Otentikasi pada tingkat pengguna sebenarnya tidak dibangun ke dalam REST API. Autent berbasis cookie WordPress standar berfungsi dengan baik, namun API tidak menawarkan cara untuk mendapatkan cookie itu. Ini akan menerimanya jika ada, tetapi Anda harus melakukan aliran login normal untuk mendapatkan cookie seperti itu. Jika Anda menginginkan pendekatan otentikasi lain, maka Anda memerlukan plugin untuk itu.

Ada empat plugin seperti itu. Ini adalah OAuth 1.0, Kata Sandi Aplikasi, Token Web JSON, dan plugin Otentikasi Dasar. Perhatikan bahwa Otentikasi Dasar paling mudah, tetapi juga tidak aman dan karenanya hanya disarankan untuk tujuan pengujian dan pengembangan. Seharusnya tidak digunakan pada server produksi langsung.

Anda dapat menemukan informasi lebih lanjut tentang plugin ini di sini:

https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/#authentication-plugins

Otto
sumber