Intereting Posts
wordpress в wamp lan не загружает css Нечетная проблема functions.php в WordPress Избежать столкновения имени класса при использовании сторонних библиотек в плагинах? Создание пользовательской формы и страницы загрузки в разделе администратора нужен wp-конструктор или тема, реагирующая на соотношение сторон или ориентацию экрана Поиск пользовательских таксономических тегов Установка статической домашней страницы и страницы блога без использования настроек Правила перезаписи HTTPS в HTTP не работают должным образом не публиковать сообщение post post post, если поле метаданных недействительно Удалить таксономию, если нет таксономии для пользовательского типа отправки? Как узнать, какие функции назначены действиям? WP_Query: поиск и фильтрация с использованием настраиваемого поля AND / OR пользовательская таксономия При упорядочивании категорий всегда меняются при публикации статьи Загрузите url с минимальными / отсутствующими запросами DB Альтернатива системе уведомлений по электронной почте?

Как проверить пользователя из ouside wordpress / php?

Я работаю над приложением 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 auth все еще действителен. Но, как кажется, это невозможно сделать, поскольку wp_validate_auth_cookie () всегда терпит неудачу, даже если передаются данные cookie зарегистрированного пользователя. Другое решение может заключаться в разработке плагина, который хранит sessionid и userid в таблице, что может быть легко запрошено сервлетами. Или, может быть, есть другое решение …

WordPress уже имеет API, встроенный через сервер XMLRPC. Смысл, вы можете сделать запрос XMLRPC из своего java-приложения и проверить имя пользователя / пароль. К сожалению, нет возможности просто аутентифицироваться через него, как есть.

Тем не менее, очень легко сворачивать свои собственные. Просто подключитесь к xmlrpc_methods , фильтру и добавьте свой. Ключ массива, который вы добавляете, – это метод xmlrpc, который вы вызываете из своего приложения, а значение будет функцией, вызываемой сервером XMLRPC WordPress.

 <?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; } 

Вот и все это как плагин . С установленным и включенным XMLRPC на вашем сайте WP вы должны будете делать запросы с некоторым клиентом XMLRPC (я уверен, что у него есть Java).

Вот код, который я использовал для тестирования выше (клиент Python XMLRPC).

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

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 auth (вместо проверки имени пользователя и пароля, как это обычно делается).

Получите плагин Exec-PHP , а затем создайте страницу WordPress (а не сообщение) с хорошей постоянной http://mysite/user_id/ ( 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/ . Затем вы узнаете, зарегистрирован ли пользователь и каков его идентификатор пользователя.

Вы можете сделать что-то подобное на страницах, отличных от 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 } ?> 

Это однофакторный плагин 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 не проверяет), либо идентификатор пользователя, если проверка прошла успешно.