2017-09-14 3 views
1

Je travaille sur une application frontale qui se lie à l'API wordpress qui se trouve sur un domaine distinct.WP-API Récupération des brouillons "Nonce cookie n'est pas valide"

Je souhaite récupérer un brouillon de publication, de sorte que lorsque l'utilisateur clique sur «Aperçu de la publication» dans le panneau d'administration de Wordpress, il ouvre mon application avec le contenu correct.

Je charge du Javascript dans l'Admin WP afin que je puisse modifier tous les liens de "Preview Post" dans le panneau d'administration avec un jeton wp_nonce à des fins d'authentification. Cela se fait en utilisant l'extrait ci-dessous, qui tord le lien post aperçu dans par exemple: http://example.com/blog?p=127&preview=true&auth=16045802ee

function admin_inline_js(){ 

    // Grab URL 
    echo ' 
    <script> 
    document.addEventListener("DOMContentLoaded", function() { 
     // Grab all preview anchors 
     var anchors = document.querySelectorAll("a[href*=\'preview=true\']"), i; 
     // Loop through and amend to remove the trailing slash, as WP doesnt provide any easy method to achieve this. 
     for(i = 0; i < anchors.length; i++) { 
      anchors[i].href = anchors[i].href.replace("blog/", "blog") + \'&auth=' . wp_create_nonce('wp_rest') .'\'; 
     } 
    }); 
    </script> 
    '; 
} 
add_action('admin_print_scripts', 'admin_inline_js'); 

A http://example.com/blog?p=127&preview=true&auth=16045802ee, le paramètre auth est ensuite utilisé pour poster une demande de retour à wordpress pour récupérer le projet avec un ID de 127, avec un jeton nonce de 16045802ee. Cependant, cela ne fonctionne pas, et j'obtenir cette réponse:

object(stdClass)#459 (3) { ["code"]=> string(25) "rest_cookie_invalid_nonce" ["message"]=> string(23) "Cookie nonce is invalid" ["data"]=> object(stdClass)#532 (1) { ["status"]=> int(403) } } 

Quelqu'un peut-il repérer ce que je fais mal ici? :/

Merci.

Répondre

0

Il y a deux problèmes auxquels vous êtes confrontés:

  1. Un Wordpress « nonce » est un outil qui est uniquement destiné à protéger contre des jetons CSRF. Très utile lors de l'écriture de plugins pour le panneau d'administration, mais pas utile pour l'authentification par rapport à l'API.

  2. La transmission des informations d'authentification via l'API est bloquée par le fichier .htaccess prescrit par défaut.

Vous devez transmettre les informations d'authentification via l'API afin de recevoir les réponses contenant les données protégées. Pour simplifier, je recommande d'utiliser HTTP Basic Auth pour que cela fonctionne en premier, en améliorant éventuellement votre code avec des méthodes d'authentification plus sécurisées comme OAuth à l'avenir.

Je recommande de créer un nouvel utilisateur spécifiquement pour l'utilisation de l'API, plutôt que de transmettre des informations d'administration dans des fichiers texte sur votre serveur.

Une fois que vous avez votre utilisateur créé, vous pouvez demander le projet de message en utilisant cURL simples en PHP comme suit:

$apiUsername = "apiuser"; 
$apiPassword = "sup3r-s3cr3t-p455w0rd"; 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://example.com/wp-json/wp/v2/posts/127"); 
curl_setopt($ch, CURLOPT_USERPWD, "$apiUsername:$apiPassword"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
$json = curl_exec($ch); 
$postObject = json_decode($json); 

Cela définira en-tête de requête contenant le nom d'utilisateur et mot de passe, et tant que rien ne gêne cet en-tête avant qu'il arrive à Wordpress, vous recevrez vos détails de poste dans $postObject et vous pouvez arrêter de lire ici. Vous avez terminé.


Cependant, pour un peu de plaisir supplémentaire, le fichier par défaut .htaccess prescrits Wordpress tombe en-têtes HTTP, donc si vous utilisez que vous aurez besoin de réparer vous-même. Fondamentalement, les scripts Wordpress doivent voir les clés PHP_AUTH_USER et PHP_AUTH_PW dans la variable $_SERVER pour que cela fonctionne.

Une solution rapide consiste à inclure la règle suivante en tant que première RewriteRule dans.htaccess:

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}] 

qui séparera les en-têtes en variables préfixées « REMOTE_USER », et le PHP ci-dessous peuvent être utilisés pour remplir les champs prévus à nouveau (peut-être cela peut aller dans index.php).

$userPass = $_SERVER["REDIRECT_REMOTE_USER"]; 
if(!empty($userPass) 
&& strstr($userPass, "Basic")) { 
     $userPass = substr($userPass, strpos($userPass, " ") + 1); 
     $userPass = base64_decode($userPass); 
     $userPass = explode(":", $userPass); 

     $_SERVER['PHP_AUTH_USER'] = $userPass[0]; 
     $_SERVER['PHP_AUTH_PW'] = $userPass[1]; 
}