Comment valider un utilisateur à partir de WordPress / PHP?


9

Je travaille sur une application ajax qui sera intégrée dans une page wordpress. L'application ajax échange des données avec des servlets fonctionnant sur tomcat. Désormais, les servlets ont besoin d'un moyen de déterminer si une demande provient d'un utilisateur connecté à wordpress. Et si l'utilisateur est connecté, les servlets doivent également pouvoir déterminer l'ID des utilisateurs afin de pouvoir interroger la base de données. Si l'utilisateur n'est pas connecté, la demande sera refusée.

En d'autres termes, je dois autoriser une servlet à exécuter une requête uniquement si l'utilisateur à l'origine de la requête est connecté à wordpress (version 3.3.x). Le servlet (tomcat) et wordpress (apache2) s'exécutent sur la même machine physique et partagent la même base de données.

En théorie, cela pourrait facilement être 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 exécuter ou refuser la demande.

La question est de savoir comment cela peut être mis en œuvre du côté wordpress?
Parce que, ce qui rend la théorie si compliquée, c'est le fait que je n'ai pas encore fait de programmation php.

Je pensais d'abord à transmettre le cookie wordpress_logged_in (auth) au servlet et laisser le servlet interroger 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 être de développer un plugin qui stocke l'ID session et l'ID utilisateur dans une table, qui pourrait facilement être interrogée par les servlets. Ou peut-être qu'il y a une autre solution ...


Pourquoi ne pas écrire ou utiliser un plugin qui offre une authentification utilisateur en tant que service AJAX? Il pourrait utiliser l'intégralité de la pile WP et toute application pourrait l'utiliser en émettant une requête HTTP appropriée. Veillez cependant à protéger correctement les informations d'identification de votre utilisateur.
Raphael

Je pense que je me suis mal exprimé, je n'ai pas besoin d'un service d'authentification ajax. J'ai besoin d'un moyen pour permettre à un servlet de valider un utilisateur déjà authentifié. C'est à dire vérifier si l'utilisateur est toujours connecté. Le point est le suivant: l'utilisateur se connecte, accède à une application ajax, qui communique avec le servlet pour stocker / récupérer des données. Maintenant, le servlet a besoin d'un moyen pour 1) tester si la demande provient d'un utilisateur connecté et 2) récupérer l'ID des utilisateurs (pour un accès ultérieur à la base de données).
Davos Seaworth

Vous devriez peut-être modifier votre question pour intégrer tous ces commentaires. De préférence, présentez votre problème (!) Et quelle est votre idée. En particulier, décrivez clairement, étape par étape, le processus que vous envisagez.
Raphael

J'espère que la question est plus claire maintenant.
Davos Seaworth

comment avez-vous fini par le faire? pourriez-vous partager votre solution? avez-vous utilisé XMLRPC?
pkyeck

Réponses:


7

WordPress possède 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'y a aucun moyen de s'authentifier tel quel.

Cela dit, il est très facile de rouler le vôtre. Accrochez-vous simplement à xmlrpc_methodsun filtre et ajoutez le vôtre. La clé de tableau que vous ajoutez est la méthode xmlrpc que vous appelez à partir de votre application, et la valeur sera la fonction qui sera 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,, recevrait un argument, le tableau de choses envoyé 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 cela en tant que plugin . Avec cela installé et XMLRPC activé sur votre site WP, vous devriez pouvoir faire des demandes avec un client XMLRPC (je suis sûr que Java en a un).

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

1
Je vous remercie! Cela m'amène un pas de plus énorme! La même chose peut-elle être obtenue en utilisant le cookie d'authentification des utilisateurs? Donc, je n'ai pas besoin de stocker et d'envoyer le nom d'utilisateur / pwd sur le fil? Mon projet consiste en une application ajax intégrée à une page wordpress. L'application ajax appelle un servlet et le servlet demande à wordpress si l'utilisateur est authentifié. Je pourrais transmettre l'utilisateur / pwd à l'application ajax et le transférer sur le servlet, mais je crains que ce ne soit pas très sécurisé. J'ai donc essayé de transmettre le contenu du cookie d'authentification à wp_validate_auth_cookie () mais il échoue toujours.
Davos Seaworth

Je voudrais simplement générer un jeton ou quelque chose pour l'utilisateur et le stocker aux deux extrémités du système. Passez ensuite le jeton d'avant en arrière.
chrisguitarguy

2

Wordpress vérifie (actuellement) 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 faisant 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 celui-ci et les autres fonctions auth_cookie) dans votre code Java pour effectuer les mêmes vérifications. JS pourrait être utilisé pour s'assurer que le cookie est envoyé à votre servlet.

Sinon, XMLRPC pourrait être une bonne idée. Vous pouvez é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 cela se fait généralement).


2

Obtenez le plugin Exec-PHP , puis créez une page WordPress (pas un article) avec un joli permalien ( http://mysite/user_id/) et le code sur la get_current_user_id()référence de l' API :

<?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 envoyer dans une GETdemande http://127.0.0.1/user_id/. Vous saurez alors si l'utilisateur est connecté et quel est son ID utilisateur.


1

Vous pouvez faire quelque chose comme ça 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
}

?>

Merci pour la réponse, le problème est que les servlets sont écrits en java, donc le code php ne peut pas être exécuté. Ce que je recherche, c'est une sorte d'interface externe qui permet à un servlet / java de communiquer avec wordpress / php. Il y a certainement une sorte d'interface disponible, je suis tout simplement incapable de la trouver ...
Davos Seaworth

Ah, je vois. Peut-être que l'utilisation de quelque chose comme Quercus caucho.com/resin-3.0/quercus pourrait vous offrir le meilleur des deux mondes?
FlashingCursor

Merci, mais quercus n'est pas la bonne solution, car j'ai déjà une installation wordpress / php / apache et une servlet / java / tomcat qui fonctionnent. Maintenant, la seule chose dont j'ai besoin est une interface entre ces deux, qui permet à la servlet de vérifier si un utilisateur est connecté à wordpress (une interface / protocole / ipc / autre).
Davos Seaworth

1

Ceci est un plugin WordPress à 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 wordpress_logged_in_...cookie.

Vous devez ensuite écrire du code pour interroger cette méthode et lui transmettre la valeur du wordpress_logged_in_...cookie.

Cette méthode renvoie soit false(si le cookie ne valide pas) ou l'ID utilisateur si la validation réussit.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.