web-dev-qa-db-fra.com

Commenter un utilisateur extérieur à wordpress/php?

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:

  1. Lors de la connexion à WordPress, certains jetons utilisateur sont stockés dans une variable javascript.
  2. L'application ajax transfère le jeton utilisateur aux servlets à chaque appel.
  3. Les servlets utilisent le jeton pour interroger wordpress s'il est valide (c'est-à-dire si l'utilisateur est connecté) et pour exécuter ou refuser la demande.

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

9
Davos Seaworth

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
7
chrisguitarguy

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.

2
Olathe

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

2
laughingbovine

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.

1
kYuZz

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
}

?>
1
FlashingCursor