Cum să: Faci cereri autentificate JWT către API-ul WordPress
Acesta nu este propriu-zis o întrebare, ci un ghid despre cum să faci cereri autentificate către API-ul WordPress folosind JWT. Scriu acest articol ca memento pentru mine și pentru cei care ar putea avea nevoie de ajutor pe această temă.

De ce autentificare JWT
Construiesc un site care folosește WordPress ca back-end și o aplicație React+Redux ca front-end, așa că preiau tot conținutul în front-end prin cereri către API-ul WordPress. Unele cereri (în special, cererile POST) trebuie să fie autentificate, moment în care am dat peste JWT.
De ce avem nevoie
Pentru a folosi autentificarea JWT cu WordPress, mai întâi trebuie să instalăm plugin-ul JWT Authentication for WP REST API. După cum se explică în instrucțiunile plugin-ului, trebuie să modificăm și unele fișiere de bază WordPress. În special:
În fișierul .htaccess din folderul rădăcină al instalării WordPress, trebuie să adăugăm următoarele linii:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
În fișierul wp-config.php, tot din folderul rădăcină al instalării WordPress, trebuie să adăugăm aceste linii:
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Înlocuiți 'your-top-secret-key' cu o cheie secretă reală.
define('JWT_AUTH_CORS_ENABLE', true);
Testarea disponibilității JWT
Pentru a verifica dacă putem folosi acum JWT, porniți Postman și faceți o cerere la 'index'-ul implicit al API-ului WordPress:
http://example.com/wp-json/
Câteva endpoint-uri noi, cum ar fi /jwt-auth/v1
și /jwt-auth/v1/token
, ar fi trebuit să fie adăugate la API. Dacă le găsiți în răspunsul la cererea de mai sus, înseamnă că JWT este acum disponibil.
Obținerea token-ului JWT
Să rămânem în Postman pentru moment și să solicităm un token de la API-ul WordPress:
http://example.com/wp-json/jwt-auth/v1/token
Răspunsul va conține token-ul JWT, care este o cheie criptată care arată cam așa:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM
Efectuarea unei cereri autentificate
Să încercăm să schimbăm titlul unui post cu ID-ul 300 ca exemplu de cerere autentificată cu JWT.
În Postman, alegeți POST ca metodă și tastați următorul endpoint:
http://example.com/wp-json/wp/v2/posts/300
Alegeți No Auth în fila Authorization și adăugați următoarele în fila Headers:
'Content-type': 'application/json',
'Authorization': 'Bearer jwtToken' // Înlocuiți jwtToken cu token-ul real (cheia criptată de mai sus)
În final, în fila Body, selectați opțiunile raw și JSON (application/json), apoi în editorul de sub opțiuni tastați următoarele:
{ "title": "DA! Cererile autentificate cu JWT funcționează" }
Acum puteți apăsa SEND. Verificați în fila de răspuns cu toate datele despre postarea pe care am solicitat-o: valoarea pentru cheia title ar trebui să fie acum DA! Cererile autentificate cu JWT funcționează

Cum ai face diferența între apelurile care trebuie să fie autentificate și cele care nu trebuie să fie autentificate în back-end?

De asemenea, construiesc o aplicație React care preia datele postărilor din baza de date WordPress folosind WordPress REST API, dar nu vreau ca punctele de acces ale REST API să fie disponibile public. Există vreo modalitate de a restricționa accesul la REST API, cu excepția aplicației mele React?

@chris Dacă dorești ca punctele tale de acces să fie ascunse de cererile neautorizate, adaugă-le sub namespace-ul jwt_auth, de exemplu astfel: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ...
. Orice se află sub /jwt-auth/ va necesita autorizare

@uruk odată ce ai tokenul JWT, cred că îl poți trimite mereu, așa că nu e nevoie să faci distincție între ce este necesar și ce nu.

După cum văd, acest plugin nu a fost actualizat de mult timp, mai este sigur să-l folosești?

@Lai32290 Acest plugin pare să fie actualizat și se bazează pe plugin-ul menționat în această întrebare: https://wordpress.org/plugins/jwt-auth/

@uruk așa am realizat distincția între apelurile care trebuie autentificate și cele care nu necesită, fără plugin: Cum să forțezi Autentificarea pe REST API pentru pagini protejate cu parolă folosind tabelă personalizată și fetch() fără Plugin

Complementând răspunsul lui @grazianodev, iată cum poți obține token-ul de autorizare folosind cURL:
/**
* Generează un token JWT pentru apelurile viitoare către API-ul 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);
# Credențiale de administrator aici
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass");
// primește răspunsul de la server ...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
if ($server_output === false) {
die('Eroare la obținerea token-ului JWT pe WordPress pentru integrarea API.');
}
$server_output = json_decode($server_output);
if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
die('Răspuns invalid la obținerea token-ului JWT pe WordPress pentru integrarea API.');
}
if (!empty($server_output->token)) {
$this->token = $server_output->token; # Token-ul este aici
curl_close ($ch);
return true;
} else {
die('Răspuns invalid la obținerea token-ului JWT pe WordPress pentru integrarea API.');
}
return false;
}
După aceea, trimite cererile cu header-ul: "Authorization: Bearer $token"
Unde $token este token-ul returnat de funcția getToken() de mai sus.
Personal, folosesc plugin-ul "Disable REST API and Require JWT / OAuth Authentication" pentru a restricționa accesul la API doar cu token-ul de mai sus.
