Cara: Membuat permintaan yang diautentikasi JWT ke API Wordpress

17

Ini sebenarnya bukan pertanyaan tetapi panduan tentang cara membuat permintaan terotentikasi ke Wordpress API menggunakan JWT. Saya menulis ini sebagai pengingat bagi diri saya dan bagi mereka yang mungkin membutuhkan bantuan dengan topik yang sama.

grazianodev
sumber
3
Anda harus memformat ini sebagai pertanyaan, lalu memposting solusi sebagai jawaban yang sebenarnya. Kalau tidak, itu tampak seperti pertanyaan yang tidak terjawab.
Jacob Peattie
2
Ada juga panduan bagus ini firxworx.com/blog/wordpress/…
Armando

Jawaban:

19

Mengapa otentikasi JWT

Saya sedang membangun situs yang menggunakan Wordpress sebagai back-end, dan aplikasi React + Redux sebagai front-end, jadi saya menarik semua konten di front-end dengan membuat permintaan ke Wordpress API. Beberapa permintaan (terutama, permintaan POST) harus diautentikasi, yaitu ketika saya menemukan JWT.

Apa yang kita butuhkan

Untuk menggunakan otentikasi JWT dengan Wordpress, pertama-tama kita harus menginstal JWT Authentication untuk plugin WP REST API . Seperti yang dijelaskan dalam instruksi plugin, kita juga perlu memodifikasi beberapa file inti Wordpress. Khususnya:

Dalam file .htaccess yang termasuk dalam folder root instalasi Wordpress, kita perlu menambahkan baris berikut:

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

Dalam file wp-config.php, juga termasuk dalam folder root instalasi Wordpress, kita perlu menambahkan baris-baris ini:

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);

Pengujian untuk melihat apakah JWT tersedia

Untuk memverifikasi bahwa kita sekarang dapat menggunakan JWT, jalankan Postman dan buat permintaan ke 'indeks' default API Wordpress:

http://example.com/wp-json/

Beberapa titik akhir baru, seperti /jwt-auth/v1dan /jwt-auth/v1/tokenseharusnya ditambahkan ke API. Jika Anda dapat menemukannya dalam menanggapi permintaan di atas, itu berarti JWT sekarang tersedia.

Mendapatkan token JWT

Mari kita tetap di Postman untuk saat ini, dan mari kita minta token ke Wordpress API:

http://example.com/wp-json/jwt-auth/v1/token

Respons akan berisi token JWT, yang merupakan kunci terenkripsi yang terlihat seperti ini:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Membuat permintaan yang diautentikasi

Mari kita coba mengubah judul posting dengan ID 300 sebagai contoh permintaan terotentikasi dengan JWT.

Di tukang pos, pilih POST sebagai metode dan ketik titik akhir berikut:

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

Pilih Tanpa Auth di tab Otorisasi, dan tambahkan berikut ini di tab Header:

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)

Akhirnya, pada tab Tubuh, pilih opsi mentah dan JSON (aplikasi / json), lalu di editor tepat di bawah opsi ketik yang berikut ini:

{ "title": "YES! Authenticated requests with JWT work" }

Sekarang Anda dapat menekan KIRIM. Lihat di tab respons dengan semua data tentang pos yang kami minta: nilai untuk kunci judul seharusnya sekarangYES! Authenticated requests with JWT work

grazianodev
sumber
2
Bagaimana Anda membedakan antara panggilan yang harus diautentikasi dan yang tidak harus diautentikasi di back-end?
uruk
Saya juga membuat aplikasi Bereaksi yang menarik data posting dari database WordPress menggunakan WordPress REST API, namun, saya tidak ingin memiliki titik akhir API REST tersedia untuk umum. Apakah ada cara untuk membatasi akses ke REST API kecuali untuk aplikasi Bereaksi saya?
Chris
@ Chris Jika Anda ingin endpoint Anda akan tersembunyi dari permintaan non resmi, menambahkan mereka di bawah namespace jwt_auth, yaitu seperti: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Apa pun yang berada di bawah / jwt-auth / perlu otorisasi
Athoxx
3

Melengkapi jawaban @ grazianodev, ini adalah bagaimana Anda mendapatkan token otorisasi Anda menggunakan cURL:

/**
*   Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
    curl_setopt($ch, CURLOPT_POST, 1);

    # Admin credentials here
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Error getting JWT token on WordPress for API integration.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token is here
        curl_close ($ch);
        return true;
    } else {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }
    return false;
}

Setelah itu, kirim permintaan Anda dengan tajuk: "Otorisasi: Bearer $ token"

Di mana $ token adalah token yang dikembalikan oleh fungsi getToken () di atas.

Saya pribadi menggunakan plugin " Nonaktifkan REST API dan Membutuhkan JWT / OAuth Authentication " untuk membatasi akses API hanya dengan token di atas.

Lucas Bustamante
sumber