วิธีการ: ส่งคำขอตรวจสอบสิทธิ์ JWT ไปยัง Wordpress API


17

นี่ไม่ใช่คำถาม แต่เป็นแนวทางในการขอการรับรองความถูกต้องกับ Wordpress API โดยใช้ JWT ฉันกำลังเขียนสิ่งนี้เป็นเครื่องเตือนใจฉันและสำหรับผู้ที่อาจต้องการความช่วยเหลือในหัวข้อเดียวกัน


3
คุณควรจัดรูปแบบนี้เป็นคำถามจากนั้นโพสต์โซลูชันเป็นคำตอบจริง มิฉะนั้นดูเหมือนคำถามที่ไม่ได้ตอบ
Jacob Peattie

2
นอกจากนี้ยังมีคำแนะนำที่ดีนี้firxworx.com/blog/wordpress/…
Armando

คำตอบ:


19

ทำไมต้องตรวจสอบ JWT

ฉันกำลังสร้างเว็บไซต์ที่ใช้ Wordpress เป็นแบ็คเอนด์และแอป React + Redux เป็นส่วนหน้าดังนั้นฉันจึงดึงเนื้อหาทั้งหมดในส่วนหน้าโดยการร้องขอไปยัง Wordpress API คำขอบางอย่าง (โดยส่วนใหญ่คำขอ POST) ต้องได้รับการตรวจสอบสิทธิ์ซึ่งก็คือเมื่อฉันเจอ JWT

สิ่งที่เราต้องการ

ในการใช้การพิสูจน์ตัวตน JWT กับ Wordpress อันดับแรกเราต้องติดตั้งJWT Authentication สำหรับปลั๊กอินWP REST API ตามที่อธิบายไว้ในคำแนะนำของปลั๊กอินเรายังจำเป็นต้องแก้ไขไฟล์ corepress บางไฟล์ โดยเฉพาะอย่างยิ่ง:

ในไฟล์. htaccess ที่รวมอยู่ในโฟลเดอร์รูทของการติดตั้ง Wordpress เราจำเป็นต้องเพิ่มบรรทัดต่อไปนี้:

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

ในไฟล์ wp-config.php ซึ่งรวมอยู่ในโฟลเดอร์รูทของการติดตั้ง Wordpress เราต้องเพิ่มบรรทัดเหล่านี้:

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 พร้อมใช้งานหรือไม่

ในการตรวจสอบว่าตอนนี้เราสามารถใช้ JWT แล้วให้เปิด Postman และทำการร้องขอ 'ดัชนี' เริ่มต้นของ Wordpress API:

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

จุดปลายใหม่บางอย่างเช่น/jwt-auth/v1และ/jwt-auth/v1/tokenควรได้รับการเพิ่มลงใน API หากคุณสามารถค้นหาพวกเขาในการตอบสนองต่อการร้องขอข้างต้นก็หมายความว่าตอนนี้มี JWT

รับโทเค็น JWT

เราอยู่ในบุรุษไปรษณีย์สักพักแล้วขอโทเค็นไปยัง Wordpress API:

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

การตอบสนองจะมีโทเค็น JWT ซึ่งเป็นคีย์เข้ารหัสที่มีลักษณะดังนี้:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

การร้องขอที่มีการรับรองความถูกต้อง

ลองเปลี่ยนชื่อของโพสต์ด้วย ID 300 เป็นตัวอย่างของการร้องขอการรับรองความถูกต้องกับ JWT

ในบุรุษไปรษณีย์เลือก POST เป็นวิธีการและพิมพ์ปลายทางต่อไปนี้:

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

เลือก No Auth ในแท็บการอนุญาตและเพิ่มรายการต่อไปนี้ในแท็บส่วนหัว:

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

สุดท้ายในแท็บ Body ให้เลือกตัวเลือก raw และ JSON (application / json) จากนั้นในตัวแก้ไขด้านล่างตัวเลือกให้พิมพ์ดังต่อไปนี้:

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

ตอนนี้คุณสามารถกดปุ่มส่ง ดูในแท็บการตอบกลับพร้อมด้วยข้อมูลทั้งหมดเกี่ยวกับโพสต์ที่เราร้องขอ: ตอนนี้ค่าสำหรับคีย์ชื่อควรเป็นYES! Authenticated requests with JWT work


2
คุณจะแยกความแตกต่างระหว่างการโทรที่ต้องได้รับการรับรองความถูกต้องและวิธีการที่ไม่ต้องมีการรับรองความถูกต้องในส่วนหลังได้อย่างไร
uruk

ฉันยังสร้างแอป React ซึ่งดึงข้อมูลการโพสต์จากฐานข้อมูล WordPress โดยใช้ WordPress REST API อย่างไรก็ตามฉันไม่ต้องการให้ปลายทาง REST API เปิดเผยต่อสาธารณชน มีวิธี จำกัด การเข้าถึง REST API ยกเว้นแอป React ของฉันหรือไม่
Chris

@ Chris ถ้าคุณต้องการที่ปลายทางของคุณจะถูกซ่อนอยู่ห่างจากผู้มีอำนาจร้องขอบุหรี่, เพิ่มพวกเขาภายใต้ namespace jwt_auth register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... คือชอบโดย: สิ่งใดภายใต้ / jwt-auth / จะต้องได้รับอนุญาต
Athoxx

4

การตอบกลับคำตอบของ @ grazianodev นี่คือวิธีที่คุณได้รับโทเค็นการอนุญาตโดยใช้ 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;
}

หลังจากนั้นส่งคำขอของคุณด้วยหัวข้อ: "การอนุญาต: Bearer $ token"

โดยที่ $ token เป็นโทเค็นที่ส่งคืนโดยฟังก์ชัน getToken () ด้านบน

ฉันเองใช้ปลั๊กอิน " ปิดใช้งาน REST API และต้องการการรับรองความถูกต้อง JWT / OAuth " เพื่อ จำกัด การเข้าถึง API ด้วยโทเค็นด้านบนเท่านั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.