web-dev-qa-db-fra.com

Comment: effectuer des requêtes authentifiées par JWT à l'API Wordpress

Ce n'est pas vraiment une question mais un guide sur la façon de faire des requêtes authentifiées à l'API Wordpress en utilisant JWT. J'écris ceci comme un rappel à moi-même et à ceux qui pourraient avoir besoin d'aide avec le même sujet.

14
grazianodev

Pourquoi l'authentification JWT

Je construis un site qui utilise Wordpress en tant que back-end et une application React + Redux en tant que front-end. Je tire donc tout le contenu du front-end en adressant des requêtes à l'API Wordpress. Certaines demandes (principalement les demandes POST) doivent être authentifiées, c'est-à-dire lorsque j'ai rencontré JWT.

Ce dont nous avons besoin

Pour utiliser l’authentification JWT avec Wordpress, nous devons d’abord installer l’authentification JWT pour WP REST API plugin. Comme expliqué dans les instructions du plugin, nous devons également modifier certains fichiers Wordpress essentiels. En particulier:

Dans le fichier .htaccess inclus dans le dossier racine de l'installation Wordpress, nous devons ajouter les lignes suivantes:

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

Dans le fichier wp-config.php, également inclus dans le dossier racine de l'installation de Wordpress, nous devons ajouter les lignes suivantes:

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 pour voir si JWT est disponible

Pour vérifier que nous pouvons maintenant utiliser JWT, lancez Postman et envoyez une demande à l'index par défaut de l'API Wordpress:

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

Quelques nouveaux points de terminaison, tels que /jwt-auth/v1 et /jwt-auth/v1/token, auraient dû être ajoutés à l'API. Si vous pouvez les trouver dans la réponse à la demande ci-dessus, cela signifie que JWT est maintenant disponible.

Obtention du jeton JWT

Restons dans Postman pour le moment et demandons un jeton à l'API Wordpress:

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

La réponse contiendra le jeton JWT, qui est une clé chiffrée qui ressemble à ceci:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

Effectuer une demande authentifiée

Essayons de changer le titre d'un article avec un ID de 300 comme exemple d'une demande authentifiée avec JWT.

Dans Postman, choisissez POST comme méthode et tapez le point final suivant:

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

Choisissez Aucune autorisation dans l'onglet Autorisation, puis ajoutez ce qui suit dans l'onglet En-têtes:

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

Enfin, dans l'onglet Corps, sélectionnez les options brutes et JSON (application/json), puis dans l'éditeur situé juste en dessous des options, entrez:

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

Maintenant, vous pouvez appuyer sur Envoyer. Recherchez dans l'onglet de réponse toutes les données relatives à la publication demandée: la valeur de la clé de titre doit maintenant être YES! Authenticated requests with JWT work

16
grazianodev

En complément de la réponse de @ grazianodev, voici comment vous obtenez votre jeton d'autorisation à l'aide de 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;
}

Après cela, envoyez vos demandes avec l'en-tête: "Authorization: Bearer $ token"

Où $ jeton est le jeton renvoyé par la fonction getToken () ci-dessus.

J'utilise personnellement le plug-in " Disable REST API et Require JWT/OAuth Authentication " pour limiter l'accès à l'API uniquement avec le jeton ci-dessus.

3
Lucas Bustamante