Як перевірити користувача від ouside wordpress / php?


9

Я працюю над додатком ajax, який буде вбудований у сторінку wordpress. Додаток ajax обмінюється даними з сервлетами, що працюють на tomcat. Тепер сервлетам потрібен спосіб визначити, чи надходить запит від користувача, який увійшов до wordpress. І якщо користувач увійшов у систему, сервлети також повинні мати можливість визначати ідентифікатор користувачів, щоб мати можливість запитувати базу даних. Якщо користувач не зареєструється, у запиті буде відхилено.

Отже, іншими словами, мені потрібно дозволити сервлету виконувати запит, лише якщо користувач, який викликав запит, увійшов до wordpress (версія 3.3.x). І сервлет (tomcat), і wordpress (apache2) працюють на одній фізичній машині і мають спільну базу даних.

Теоретично це можна було легко вирішити, зробивши наступне:

  1. Під час входу в wordpress деякий маркер користувача зберігається у змінній javascript.
  2. Додаток ajax пересилає користувацький маркер сервлетам під час кожного дзвінка.
  3. Сервлети використовують маркер для запиту wordpress, якщо він дійсний (тобто, якщо користувач увійшов у систему) і виконувати або відхиляти запит.

Питання в тому, як це можна реалізувати на стороні wordpress?
Тому що те, що робить теорію такою складною, це той факт, що я ще не зробив жодного програмування на php.

Спочатку я думав передати cookie wordpress_logged_in (auth) сервлету і дозволити сервлету запитувати wordpress, якщо файл cookie автентичності все-таки дійсний. Але, як здається, цього зробити не можна, оскільки wp_validate_auth_cookie () завжди виходить з ладу, навіть якщо передаються файли cookie даних, які зареєстровані користувачем. Іншим рішенням може бути розробка плагіна, який зберігає sessionid та userid у таблиці, яку легко можна буде запитати сервлетами. А може, є інше рішення ...


Чому б не написати або використовувати плагін, який пропонує аутентифікацію користувача як послугу AJAX? Він може використовувати весь стек WP, і будь-яка програма може використовувати його, надсилаючи відповідний запит HTTP. Хоча подбайте про належний захист облікових даних користувачів.
Рафаель

Я думаю, що я висловив себе неправильно, мені не потрібен сервер автентифікації Ajax. Що мені потрібно - це спосіб дозволити сервлету перевірити вже автентифікованого користувача. Тобто перевірте, чи користувач все ж увійшов у систему. Суть у цьому: Користувач входить у систему, отримує доступ до програми ajax, який повідомляє сервлету для зберігання / отримання даних. Тепер сервлет потребує певного способу 1) перевірити, якщо запит надходить від зареєстрованого користувача та 2) отримати ідентифікатор користувача (для подальшого доступу до бази даних).
Давос Морворт

Можливо, ви повинні відредагувати своє запитання, щоб включити всі ці коментарі. Переважно, презентуйте свою проблему (!) Та яку вашу ідею. Зокрема, дайте чіткий покроковий опис процесу, який ви передбачаєте.
Рафаель

Сподіваюсь, питання зараз є більш зрозумілим.
Давос Морворт

як ти закінчив це робити? Ви могли б поділитися своїм рішенням? ви використовували XMLRPC?
pkyeck

Відповіді:


7

У WordPress вже є вбудований API через сервер XMLRPC. Це означає, що ви можете зробити запит XMLRPC з програми java та підтвердити ім’я користувача / пароль. На жаль, немає способу просто пройти автентифікацію через нього як є.

Однак, дуже просто прокатати своє. Просто підключіть xmlrpc_methodsфільтр і додайте своє. Ключ масиву, який ви додаєте, являє собою метод xmlrpc, який ви телефонуєте зі свого додатка, і значенням буде функція, яку викликає сервер 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;
}

І функція зворотного виклику, wpse39662_check_loginпередасть йому один аргумент, масив речей, надісланий на сервер 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;
}

Ось все це як плагін . Якщо на вашому WP-сайті встановлено встановлений і XMLRPC, ви зможете робити запити з деяким клієнтом XMLRPC (я впевнений, що у Java є такий).

Ось код, який я використовував для тестування вище (клієнт Python XMLRPC).

>>> import xmlrpclib as xmlrpc
>>> s = xmlrpc.ServerProxy('http://wordpress.dev/xmlrpc.php')
>>> s.wpse39662.login('admin', 'password')
True

1
Дякую! Це приносить мені величезний крок далі! Чи можна цього досягти, використовуючи файли cookie користувачів? Тож мені не потрібно зберігати та надсилати ім’я користувача / pwd через провід? Мій проект складається з програми Ajax, вбудованого в сторінку WordPress. Додаток ajax викликає сервлет, і сервлет запитує wordpress, чи користувач має автентифікацію. Я міг би передати користувача / pwd до програми ajax і перенести його на сервлет, але боюся, що це було б не дуже безпечно. Тому я спробував передати вміст файлу cookie auth до wp_validate_auth_cookie (), але це завжди не вдається.
Давос Морворт

Я просто генерував би токен або щось для користувача та зберігав би його на обох кінцях системи. Потім передайте маркер вперед і назад.
chrisguitarguy

2

Wordpress (на даний момент) перевіряє, чи користувач все ж увійшов у систему, перевіривши одне з файлів cookie, які він видає після входу. Він будує вміст цього файлу cookie, роблячи хеширование. Деталі містяться у функції "wp_generate_auth_cookie" в /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);
}

Ви можете заново створити цей алгоритм (використовуючи цю та інші функції auth_cookie) у вашому коді Java, щоб зробити ті самі перевірки. JS можна використовувати, щоб переконатися, що файл cookie надсилається на ваш сервлет.

Інакше XMLRPC може бути хорошою ідеєю. Ви можете написати новий метод (як пояснено в іншому рішення тут) для перевірки файлу cookie (замість перевірки імені користувача та пароля, як це зазвичай робиться).


2

Отримайте плагін Exec-PHP , а потім зробіть сторінку WordPress (а не повідомлення) з приємною посиланнями ( http://mysite/user_id/) та кодом у get_current_user_id()довідці 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.'.';
}
?>

Потім ви можете вилучити файли cookie, які клієнт вам надсилає, і поставити їх у GETзапиті http://127.0.0.1/user_id/. Тоді ви дізнаєтесь, чи користувач увійшов у систему та який його ідентифікатор


1

Ви можете зробити щось подібне на сторінках, що не є 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
}

?>

Дякую за відповідь, проблема полягає в тому, що сервлети написані на Java, тому php-код не може бути виконаний. Що я шукаю - це якийсь зовнішній інтерфейс, який дозволяє сервлету / Java спілкуватися з wordpress / php. Звичайно, є якийсь інтерфейс, я просто не можу його знайти ...
Давос Морворт

А, бачу. Можливо, використання чогось на кшталт Quercus caucho.com/resin-3.0/quercus може отримати найкраще з обох світів?
FlashingCursor

Дякую, але quercus - неправильне рішення, оскільки у мене вже є робочий wordpress / php / apache та робоча установка servlet / java / tomcat. Тепер єдине, що мені потрібно, - це інтерфейс між цими двома, який дозволяє сервлету перевіряти, чи користувач увійшов до wordpress (деякий інтерфейс / protocoll / ipc / що завгодно).
Давос Морвоорт

1

Це однофакторний плагін WordPress, який виконує цю роботу:

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');

В основному це відкриває новий метод XML-RPC, за допомогою якого ви можете попросити WordPress перевірити wordpress_logged_in_...файл cookie.

Потім потрібно написати якийсь код, щоб запитувати цей метод і передавати йому значення wordpress_logged_in_...файлу cookie.

Цей метод поверне або false(якщо файл cookie не підтверджує), або ідентифікатор користувача, якщо перевірка буде успішною.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.