Je travaille sur une application ajax qui sera intégrée à une page wordpress. L'application ajax échange des données avec des servlets s'exécutant sur Tomcat. Les servlets ont maintenant besoin d'un moyen de déterminer si une requête provient d'un utilisateur connecté à WordPress. Et si l'utilisateur est connecté, les servlets doivent également pouvoir déterminer l'identifiant de l'utilisateur pour pouvoir interroger la base de données. Si l'utilisateur n'est pas connecté, la demande sera refusée.
Donc, en d'autres termes, je dois laisser un servlet exécuter une requête uniquement si l'utilisateur qui a provoqué la requête est connecté à wordpress (version 3.3.x). Le servlet (Tomcat) et wordpress (Apache2) s'exécutent sur le même ordinateur physique et partagent la même base de données.
En théorie, cela pourrait être facilement résolu en procédant comme suit:
La question est de savoir comment cela peut être mis en œuvre côté wordpress.
En effet, ce qui rend la théorie si compliquée, c’est le fait que je n’ai pas encore fait de programmation php.
Premièrement, je pensais transmettre le cookie wordpress_logged_in (auth) au servlet et laisser la requête servlet wordpress si le cookie d'authentification est toujours valide. Mais il semble que cela ne puisse pas être fait, car wp_validate_auth_cookie () échoue toujours, même si les données de cookie d'un utilisateur connecté sont transmises. Une autre solution pourrait consister à développer un plug-in qui stocke l'ID de session et l'ID d'utilisateur dans une table, qui pourraient facilement être interrogés par les servlets. Ou peut-être y a-t-il une autre solution ...
WordPress a déjà une API intégrée via un serveur XMLRPC. Cela signifie que vous pouvez faire une demande XMLRPC à partir de votre application Java et vérifier un nom d'utilisateur/mot de passe. Malheureusement, il n’existe aucun moyen de s’authentifier tel quel.
Cela dit, il est très facile de rouler le vôtre. Accrochez simplement un filtre xmlrpc_methods
et ajoutez le vôtre. La clé de tableau que vous ajoutez est la méthode xmlrpc que vous appelez depuis votre application et la valeur sera la fonction appelée par le serveur WordPress XMLRPC.
<?php
add_filter('xmlrpc_methods', 'wpse39662_add_login_method' );
/**
* Filters the XMLRPC methods to allow just checking the login/pass of
* a given users
*/
function wpse39662_add_login_method( $methods )
{
$methods['wpse39662.login'] = 'wpse39662_check_login';
return $methods;
}
Et la fonction de rappel, wpse39662_check_login
, obtiendrait un argument qui lui serait transmis, le tableau des éléments envoyés au serveur XMLRPC.
<?php
function wpse39662_check_login( $args )
{
$username = $args[0];
$password = $args[1];
$user = wp_authenticate( $username, $password );
if( is_wp_error( $user ) )
{
return false;
}
return true;
}
Voici tout ce que comme un plugin . Avec cette installation et XMLRPC activés sur votre site WP, vous devriez pouvoir faire des demandes avec un client XMLRPC (je suis sûr que Java en a une).
Voici le code que j'ai utilisé pour tester ce qui précède (client Python XMLRPC).
>>> import xmlrpclib as xmlrpc
>>> s = xmlrpc.ServerProxy('http://wordpress.dev/xmlrpc.php')
>>> s.wpse39662.login('admin', 'password')
True
Obtenez le plugin Exec-PHP , puis créez une page WordPress (et non un post) avec un permalien Nice (http://mysite/user_id/
) et le code de la référence de l'API get_current_user_id()
:
<?php
$user_id = get_current_user_id();
if ($user_id == 0) {
echo 'You are currently not logged in.';
} else {
echo 'You are logged in as user '.$user_id.'.';
}
?>
Vous pouvez ensuite extraire les cookies que le client vous envoie et les placer dans une demande GET
pour http://127.0.0.1/user_id/
. Ensuite, vous saurez si l'utilisateur est connecté et quel est son ID utilisateur.
Wordpress (actuellement) vérifie si l'utilisateur est toujours connecté en vérifiant l'un des cookies qu'il donne lors de la connexion. Il construit le contenu de ce cookie en effectuant du hachage. Les détails se trouvent dans la fonction "wp_generate_auth_cookie" dans /wp-includes/pluggable.php:
function wp_generate_auth_cookie($user_id, $expiration, $scheme = 'auth') {
$user = get_userdata($user_id);
$pass_frag = substr($user->user_pass, 8, 4);
$key = wp_hash($user->user_login . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $user->user_login . '|' . $expiration, $key);
$cookie = $user->user_login . '|' . $expiration . '|' . $hash;
return apply_filters('auth_cookie', $cookie, $user_id, $expiration, $scheme);
}
Vous pouvez recréer cet algorithme (en utilisant ceci et les autres fonctions auth_cookie) dans votre code Java pour effectuer les mêmes vérifications. JS peut être utilisé pour s'assurer que le cookie est envoyé à votre servlet.
Sinon, XMLRPC pourrait être une bonne idée. Vous pourriez écrire une nouvelle méthode (comme expliqué dans une autre solution ici) pour valider le cookie d'authentification (au lieu de valider le nom d'utilisateur et le mot de passe, comme c'est habituellement le cas).
Ceci est un plugin WordPress d'un fichier qui fait le travail:
function yournamespace_validateAuthCookie($cookie, $scheme = 'logged_in') {
return wp_validate_auth_cookie($cookie, $scheme);
}
function yournamespace_new_xmlrpc_methods($methods) {
$methods['yournamespace.validateAuthCookie'] = 'yournamespace_validateAuthCookie';
return $methods;
}
add_filter('xmlrpc_methods', 'yournamespace_new_xmlrpc_methods');
Il expose essentiellement une nouvelle méthode XML-RPC avec laquelle vous pouvez demander à WordPress de valider le cookie wordpress_logged_in_...
.
Vous devez ensuite écrire du code pour interroger cette méthode et lui transmettre la valeur du cookie wordpress_logged_in_...
.
Cette méthode renverra soit false
(si le cookie ne valide pas), ou l'ID utilisateur si la validation a réussi.
Vous pouvez faire quelque chose comme ceci sur les pages non-wp:
<?php
require('./wp-blog-header.php');
// Make sure ^ points to the root of your WP installation
if ( is_user_logged_in() ) {
// Perform your request here
}
?>