Come fare: Richieste autenticate JWT all'API di WordPress

1 apr 2018, 20:30:44
Visualizzazioni: 39.7K
Voti: 27

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.

2
Commenti

Dovresti formattarlo come una domanda, poi pubblicare la soluzione come una risposta effettiva. Altrimenti sembra una domanda senza risposta.

Jacob Peattie Jacob Peattie
2 apr 2018 10:26:03

C'è anche questa ottima guida https://firxworx.com/blog/wordpress/using-the-wordpress-rest-api-with-jwt-authentication/

Way Too Simple Way Too Simple
15 feb 2019 20:16:17
Tutte le risposte alla domanda 2
7
34

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

27 apr 2018 09:36:37
Commenti

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

uruk uruk
11 lug 2018 23:59:05

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 Chris
12 lug 2018 14:07:12

@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

InanisAtheos InanisAtheos
19 set 2019 23:39:09

@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.

Lai32290 Lai32290
2 mag 2020 13:38:18

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

Lai32290 Lai32290
2 mag 2020 13:39:26

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

epsilon42 epsilon42
12 ott 2020 07:14:08

@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

Jürgen Fink Jürgen Fink
7 lug 2021 19:14:11
Mostra i restanti 2 commenti
0

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.

29 lug 2018 02:17:33