Procedura: inviare richieste autenticate da JWT all'API di Wordpress


17

Questa non è davvero una domanda, ma una guida su come effettuare richieste autenticate all'API di Wordpress usando JWT. Sto scrivendo questo come promemoria per me stesso e per coloro che potrebbero aver bisogno di aiuto con lo stesso argomento.


3
È necessario formattare questo come una domanda, quindi pubblicare la soluzione come una risposta effettiva. Altrimenti sembra una domanda senza risposta.
Jacob Peattie,

2
C'è anche questa guida eccellente firxworx.com/blog/wordpress/…
Armando

Risposte:


19

Perché l'autenticazione JWT

Sto creando un sito che utilizza Wordpress come back-end e un'app React + Redux come front-end, quindi sto estraendo tutto il contenuto del front-end inviando richieste all'API di Wordpress. Alcune richieste (principalmente, richieste POST) devono essere autenticate, quando ho incontrato JWT.

Ciò che ci serve

Per utilizzare l'autenticazione JWT con Wordpress, è innanzitutto necessario installare il plug-in API REST di autenticazione JWT per WP . Come spiegato nelle istruzioni del plugin, dobbiamo anche modificare alcuni file Wordpress di base. In particolare:

Nel file .htaccess incluso nella cartella principale dell'installazione di Wordpress, è necessario aggiungere le seguenti righe:

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

Nel file wp-config.php, incluso anche nella cartella principale dell'installazione di Wordpress, è necessario aggiungere queste righe:

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

Test per verificare se JWT è disponibile

Per verificare che ora possiamo usare JWT, avvia Postman ed effettua una richiesta all'indice predefinito dell'API di Wordpress:

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

Alcuni nuovi endpoint, come /jwt-auth/v1e /jwt-auth/v1/tokenavrebbero dovuto essere aggiunti all'API. Se riesci a trovarli nella risposta alla richiesta di cui sopra, significa che JWT è ora disponibile.

Ottenere il token JWT

Rimaniamo 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

Fare una richiesta autenticata

Proviamo a cambiare il titolo di un post con un ID di 300 come esempio di una richiesta autenticata con JWT.

In Postman, selezionare POST come metodo e digitare il seguente endpoint:

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

Scegliere Nessuna autenticazione nella scheda Autorizzazione e aggiungere quanto segue nella scheda Intestazioni:

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

Infine, nella scheda Corpo, seleziona le opzioni raw e JSON (application / json), quindi nell'editor proprio sotto le opzioni digita quanto segue:

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

Ora puoi premere INVIA. Guarda nella scheda risposta con tutti i dati relativi al post che abbiamo richiesto: il valore per la chiave del titolo dovrebbe essere oraYES! Authenticated requests with JWT work


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

Sto anche creando un'app React che estrae i dati dei post dal database WordPress usando l'API REST di WordPress, tuttavia, non voglio avere gli endpoint API REST disponibili pubblicamente. Esiste un modo per limitare l'accesso all'API REST ad eccezione della mia app React?
Chris,

@ Chris Se si desidera che gli endpoint siano nascosti dalle richieste non autorizzati, aggiungerli sotto il namespace jwt_auth, vale a dire in questo modo: register_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... . Qualunque cosa sotto / jwt-auth / avrà bisogno di autorizzazione
Athoxx,

4

Completando la risposta di @ grazianodev, ecco come ottenere il token di autorizzazione utilizzando 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;
}

Successivamente, invia le tue richieste con l'intestazione: "Autorizzazione: Bearer $ token"

Dove $ token è il token restituito dalla funzione getToken () sopra.

Personalmente utilizzo il plug-in " Disabilita API REST e richiedi autenticazione JWT / OAuth " per limitare l'accesso all'API solo con il token sopra.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.