Come fare: Richieste autenticate JWT all'API di WordPress
Questo non è propriamente una domanda ma una guida su come effettuare richieste autenticate all'API di WordPress utilizzando JWT. Lo scrivo come promemoria per me stesso e per coloro che potrebbero aver bisogno di aiuto sullo stesso argomento.

Perché utilizzare l'autenticazione JWT
Sto sviluppando un sito che utilizza WordPress come back-end e un'app React+Redux come front-end, quindi recupero tutti i contenuti nel front-end effettuando richieste all'API di WordPress. Alcune richieste (principalmente le richieste POST) devono essere autenticate, ed è qui che ho incontrato JWT.
Cosa ci serve
Per utilizzare l'autenticazione JWT con WordPress, dobbiamo prima installare il plugin JWT Authentication for WP REST API. Come spiegato nelle istruzioni del plugin, dobbiamo anche modificare alcuni file core di WordPress. In particolare:
Nel file .htaccess presente nella cartella principale di installazione di WordPress, dobbiamo aggiungere le seguenti righe:
RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
Nel file wp-config.php, anch'esso presente nella cartella principale di installazione di WordPress, dobbiamo aggiungere queste righe:
define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Sostituisci 'your-top-secret-key' con una chiave segreta effettiva.
define('JWT_AUTH_CORS_ENABLE', true);
Verificare se JWT è disponibile
Per verificare che possiamo ora utilizzare JWT, avvia Postman e effettua una richiesta all'API di WordPress:
http://example.com/wp-json/
Dovrebbero essere stati aggiunti alcuni nuovi endpoint all'API, come /jwt-auth/v1
e /jwt-auth/v1/token
. Se li trovi nella risposta alla richiesta precedente, significa che JWT è ora disponibile.
Ottenere il token JWT
Restiamo in Postman per il momento e richiediamo un token all'API di WordPress:
http://example.com/wp-json/jwt-auth/v1/token
La risposta conterrà il token JWT, che è una chiave crittografata simile a questa:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM
Effettuare una richiesta autenticata
Proviamo a cambiare il titolo di un post con ID 300 come esempio di richiesta autenticata con JWT.
In Postman, seleziona POST come metodo e digita il seguente endpoint:
http://example.com/wp-json/wp/v2/posts/300
Scegli "No Auth" nella scheda Authorization e aggiungi quanto segue nella scheda Headers:
'Content-type': 'application/json',
'Authorization': 'Bearer jwtToken' // Sostituisci jwtToken con il token effettivo (la chiave crittografata sopra)
Infine, nella scheda Body, seleziona le opzioni raw e JSON (application/json), quindi nell'editor sotto le opzioni digita quanto segue:
{ "title": "SI! Le richieste autenticate con JWT funzionano" }
Ora puoi premere INVIA. Controlla nella scheda della risposta con tutti i dati del post che abbiamo richiesto: il valore per la chiave title dovrebbe ora essere SI! Le richieste autenticate con JWT funzionano

Come distingueresti tra le chiamate che devono essere autenticate e quelle che non devono esserlo nel back-end?

Sto anche costruendo un'app React che recupera i dati dei post dal database di WordPress utilizzando la WordPress REST API, tuttavia non voglio che gli endpoint della REST API siano pubblicamente disponibili. C'è un modo per limitare l'accesso alla REST API solo alla mia app React?

@chris Se vuoi che i tuoi endpoint siano nascosti a richieste non autorizzate, aggiungili sotto il namespace jwt_auth, cioè in questo modo: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ...
. Tutto ciò che si trova sotto /jwt-auth/ richiederà l'autorizzazione

@uruk una volta che hai il token JWT, penso che tu possa sempre inviarlo, quindi non hai bisogno di distinguere quale è necessario e quale no.

Da come vedo, questo plugin non è stato aggiornato da molto tempo, è ancora sicuro da usare?

@Lai32290 Questo plugin sembra essere aggiornato e appare basato sul plugin menzionato in questa domanda: https://wordpress.org/plugins/jwt-auth/

@uruk ecco come ho distinto tra chiamate che devono essere autenticate e quelle che non lo richiedono, senza plugin: Come forzare l'autenticazione sull'API REST per pagine protette da password usando tabelle personalizzate e fetch() senza Plugin

Integrando la risposta di @grazianodev, ecco come ottenere il tuo token di autorizzazione utilizzando cURL:
/**
* Genera un token JWT per le future chiamate API a 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);
# Credenziali admin qui
curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass");
// ricevi la risposta dal server...
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec ($ch);
if ($server_output === false) {
die('Errore durante il recupero del token JWT su WordPress per l\'integrazione API.');
}
$server_output = json_decode($server_output);
if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
die('Risposta non valida durante il recupero del token JWT su WordPress per l\'integrazione API.');
}
if (!empty($server_output->token)) {
$this->token = $server_output->token; # Il token è qui
curl_close ($ch);
return true;
} else {
die('Risposta non valida durante il recupero del token JWT su WordPress per l\'integrazione API.');
}
return false;
}
Dopodiché, invia le tue richieste con l'header: "Authorization: Bearer $token"
Dove $token è il token restituito dalla funzione getToken() sopra.
Personalmente utilizzo il plugin "Disable REST API and Require JWT / OAuth Authentication" per limitare l'accesso all'API solo con il token sopra indicato.
