Nasıl yapılır: Wordpress API'sına JWT kimlik doğrulamalı istekler yapma


17

Bu gerçekten bir soru değil, JWT kullanarak Wordpress API'sına doğrulanmış isteklerin nasıl yapılacağına dair bir rehber. Bunu kendime ve aynı konuda yardıma ihtiyaç duyanlara hatırlatma olarak yazıyorum.


3
Bunu bir soru olarak biçimlendirmeli ve ardından çözümü gerçek bir cevap olarak göndermelisiniz. Aksi halde cevaplanmamış bir soruya benziyor.
Jacob Peattie

2
Ayrıca bu güzel rehber var firxworx.com/blog/wordpress/…
Armando

Yanıtlar:


19

Neden JWT kimlik doğrulaması

Arka uç olarak Wordpress ve ön uç olarak React + Redux uygulamasını kullanan bir site inşa ediyorum, bu yüzden Wordpress API'ya istekte bulunarak ön uçtaki tüm içeriği çekiyorum. Bazı isteklerin (çoğunlukla POST istekleri) doğrulanması gerekir, bu da JWT ile karşılaştığım zamandır.

İhtiyacımız olan

Wordpress ile JWT kimlik doğrulamasını kullanmak için, önce WP REST API eklentisi için JWT Kimlik Doğrulamasını yüklememiz gerekir . Eklentinin talimatlarında açıklandığı gibi, bazı temel Wordpress dosyalarını da değiştirmemiz gerekiyor. Özellikle:

Wordpress kurulumunun kök klasöründe bulunan .htaccess dosyasında aşağıdaki satırları eklememiz gerekir:

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

Wordpress kurulumunun kök klasörüne de dahil olan wp-config.php dosyasında şu satırları eklememiz gerekir:

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);

JWT'nin mevcut olup olmadığını test etme

Artık JWT'yi kullanabileceğimizi doğrulamak için, Postacı'yı ateşleyin ve Wordpress API'sinin varsayılan 'dizinine' bir istekte bulunun:

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

API'ya benzer /jwt-auth/v1ve birkaç yeni uç nokta /jwt-auth/v1/tokeneklenmiş olmalıdır. Bunları yukarıdaki isteğe yanıt olarak bulabilirseniz, JWT artık kullanılabilir demektir.

JWT jetonunu alma

Şu an Postacı'da kalalım ve Wordpress API'sına bir jeton isteyelim:

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

Yanıt, şuna benzer bir şifreli anahtar olan JWT jetonunu içerecektir:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Kimliği doğrulanmış bir istekte bulunma

JWT ile kimliği doğrulanmış bir istek örneği olarak 300 numaralı bir yayının başlığını değiştirmeye çalışalım.

Postacı'da yöntem olarak POST'u seçin ve aşağıdaki bitiş noktasını yazın:

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

Yetkilendirme sekmesinde Kimlik Doğrulaması Yok'u seçin ve Üstbilgiler sekmesine aşağıdakileri ekleyin:

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

Son olarak, Gövde sekmesinde raw ve JSON (application / json) seçeneklerini seçin, ardından seçeneklerin hemen altındaki düzenleyicide aşağıdakileri yazın:

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

Şimdi GÖNDER'e basabilirsiniz. Yanıt sekmesine istediğimiz gönderiyle ilgili tüm verileri içeren bir ifadeyle bakın: Başlık anahtarı değeri artıkYES! Authenticated requests with JWT work


2
Kimliği doğrulanması gereken ve arka uçta kimliği doğrulanması gerekmeyen aramalar arasında nasıl ayrım yaparsınız?
uruk

Ayrıca WordPress REST API kullanarak WordPress veritabanından veri çeker bir React uygulaması inşa ediyorum, ancak, ben REST API uç noktaları halka açık olmasını istemiyorum. React uygulamam dışında REST API'sine erişimi kısıtlamanın bir yolu var mı?
Chris

Eğer, senin bitiş noktaları uzakta olmayan yetkili isteklerden gizlenmesini istiyoruz şöyle yani ad jwt_auth altına eklerseniz @chris: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . / Jwt-auth / altındaki her şey için yetki gerekir
Athoxx

4

@ Grazianodev'in cevabını tamamlayarak, cURL kullanarak yetkilendirme simgenizi şu şekilde alırsınız:

/**
*   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;
}

Bundan sonra, isteklerinizi şu başlıkla gönderin: "Yetkilendirme: Bearer $ token"

$ Token yukarıdaki getToken () işlevi tarafından döndürülen belirteçtir.

Ben şahsen sadece yukarıdaki jetonla API erişimini kısıtlamak için " REST API'sını Devre Dışı Bırak ve JWT / OAuth Kimlik Doğrulaması Gerektir " eklentisini kullanıyorum .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.