Cách: Tạo các yêu cầu được xác thực JWT cho API Wordpress


17

Đây thực sự không phải là một câu hỏi mà là một hướng dẫn về cách thực hiện các yêu cầu được xác thực cho API Wordpress bằng JWT. Tôi đang viết điều này như một lời nhắc nhở cho bản thân và cho những người có thể cần sự giúp đỡ với cùng một chủ đề.


3
Bạn nên định dạng câu hỏi này dưới dạng câu hỏi, sau đó đăng giải pháp dưới dạng câu trả lời thực tế. Nếu không, nó trông giống như một câu hỏi chưa được trả lời.
Jacob Peattie

2
Ngoài ra còn có hướng dẫn tốt này Firxworx.com/blog/wordpress/ từ
Armando

Câu trả lời:


19

Tại sao xác thực JWT

Tôi đang xây dựng một trang web sử dụng Wordpress làm back-end và ứng dụng React + Redux làm giao diện người dùng, vì vậy tôi sẽ lấy tất cả nội dung trong front-end bằng cách yêu cầu API Wordpress. Một số yêu cầu (chủ yếu là các yêu cầu POST) phải được xác thực, đó là khi tôi bắt gặp JWT.

Những gì chúng tôi cần

Để sử dụng xác thực JWT với Wordpress, trước tiên chúng tôi cần cài đặt plugin JWT xác thực cho WP REST API . Như được giải thích trong hướng dẫn của plugin, chúng tôi cũng cần sửa đổi một số tệp Wordpress cốt lõi. Đặc biệt:

Trong tệp .htaccess có trong thư mục gốc của bản cài đặt Wordpress, chúng ta cần thêm các dòng sau:

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

Trong tệp wp-config.php, cũng được bao gồm trong thư mục gốc của cài đặt Wordpress, chúng ta cần thêm các dòng sau:

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

Kiểm tra xem JWT có khả dụng không

Để xác minh rằng bây giờ chúng ta có thể sử dụng JWT, kích hoạt Postman và yêu cầu 'chỉ mục' mặc định của API Wordpress:

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

Một vài điểm cuối mới, thích /jwt-auth/v1/jwt-auth/v1/tokennên được thêm vào API. Nếu bạn có thể tìm thấy chúng trong phản hồi yêu cầu trên, điều đó có nghĩa là JWT hiện đã có sẵn.

Nhận mã thông báo JWT

Hãy ở lại Postman ngay bây giờ và hãy yêu cầu mã thông báo cho API Wordpress:

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

Phản hồi sẽ chứa mã thông báo JWT, đây là một khóa được mã hóa trông giống như thế này:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Yêu cầu xác thực

Hãy thử thay đổi tiêu đề của bài đăng có ID 300 làm ví dụ về yêu cầu được xác thực với JWT.

Trong Postman, chọn POST làm phương thức và nhập điểm cuối sau:

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

Chọn Không xác thực trong tab Ủy quyền và thêm phần sau vào tab Tiêu đề:

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

Cuối cùng, trong tab Body, chọn tùy chọn raw và JSON (application / json), sau đó trong trình chỉnh sửa ngay bên dưới các tùy chọn gõ như sau:

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

Bây giờ bạn có thể nhấn GỬI. Nhìn vào tab phản hồi với tất cả dữ liệu về bài đăng mà chúng tôi yêu cầu: giá trị cho khóa tiêu đề bây giờ sẽ làYES! Authenticated requests with JWT work


2
Làm thế nào bạn có thể phân biệt giữa các cuộc gọi phải được xác thực và cuộc gọi đó không phải được xác thực ở phía sau?
uruk

Tôi cũng đang xây dựng một ứng dụng React để lấy dữ liệu bài đăng từ cơ sở dữ liệu WordPress bằng API WordPress REST, tuy nhiên, tôi không muốn công khai các điểm cuối API REST. Có cách nào để hạn chế quyền truy cập vào API REST ngoại trừ ứng dụng React của tôi không?
Chris

@chris Nếu bạn muốn các điểm cuối của bạn bị ẩn khỏi các yêu cầu không được ủy quyền, hãy thêm chúng vào không gian tên jwt_auth, tức là như vậy : register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Bất cứ điều gì dưới / jwt-auth / sẽ cần sự cho phép
Athoxx

3

Bổ sung câu trả lời của @ grazianodev, đây là cách bạn nhận được mã thông báo ủy quyền của mình bằng 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;
}

Sau đó, gửi yêu cầu của bạn với tiêu đề: "Ủy quyền: Mã thông báo $ Bearer"

Trong đó $ token là mã thông báo được trả về bởi hàm getToken () ở trên.

Cá nhân tôi sử dụng plugin " Vô hiệu hóa API REST và Yêu cầu xác thực JWT / OAuth " để hạn chế quyền truy cập API chỉ với mã thông báo ở trên.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.